Avatar billede nielsbrinch Nybegynder
16. november 2003 - 19:11 Der er 19 kommentarer og
1 løsning

Hex til int med minus-tal

Jeg bruger følgende kode til at omdanne int til hex og omvendt.

Integer.toHexString(-1894216036);
Integer.parseInt("8f188e9c", 16);

Det virker upåklageligt, undtagen når jeg som i eksemplet herover, prøver at omvende et minus-hex-tal til den tilsvarende int. Så kaster parseInt en NumberFormatException.

Hvad skal jeg gøre i stedet, for at omdanne en hex der repræsenterer et minus-tal?
Avatar billede arne_v Ekspert
16. november 2003 - 19:17 #1
Prøv evt. med:

(int)Long.parseLong("8f188e9c", 16)
Avatar billede nielsbrinch Nybegynder
16. november 2003 - 19:20 #2
Det virkede :)
Avatar billede arne_v Ekspert
16. november 2003 - 19:20 #3
Ingen minus antyder positiv og positiv 0x8f188e9c kan ikke være i en int.
Avatar billede jakoba Nybegynder
16. november 2003 - 19:20 #4
hexadecimale tal er altid 'unsigned' de er pr definition positive.

så hvor 'decimale' værdier gpr fra 

Integer.MIN_VALUE  10000000 00000000 00000000 00000000  til
Integer.MAX_VALUE  01111111 11111111 11111111 11111111

går hexadecimale tal fra

zero                00000000 00000000 00000000 00000000
                    11111111 11111111 11111111 11111111

mvh JakobA
Avatar billede arne_v Ekspert
16. november 2003 - 19:21 #5
OK ?
Avatar billede nielsbrinch Nybegynder
16. november 2003 - 19:24 #6
Okay ... men (int)Long.parseLong("8f188e9c", 16) giver et negativt tal - hvordan kan den det hvis hexadecimale tal altid er positive pr. definition?
Avatar billede nielsbrinch Nybegynder
16. november 2003 - 19:24 #7
Ja, du skal have mange tak, arne
Avatar billede arne_v Ekspert
16. november 2003 - 19:27 #8
Type casten fra long til int konverterer en positiv long til en
negativ int !
Avatar billede jakoba Nybegynder
16. november 2003 - 19:28 #9
fordi (int) castingen blot klipper de ekstra bit af. hvis det der er tilbage starter med en 1-bit er det et negativt tal.
Avatar billede nielsbrinch Nybegynder
16. november 2003 - 19:33 #10
hmm, det lyder som noget værre rod
Avatar billede nielsbrinch Nybegynder
16. november 2003 - 19:35 #11
(int)Long.parseLong("56ced41c", 16) giver 1456395292

Det er et positivt tal ...
Avatar billede arne_v Ekspert
16. november 2003 - 19:39 #12
Jeg har udtrykt mig forkert.

Type casten fra long til int konverterer en positiv long til en negativ
int, hvis det 8. hexadecimale ciffer fra højre af er 8-F.

Og det var det i dit oprindelige eksempel.

Og det vil det være for alle negative int.
Avatar billede nielsbrinch Nybegynder
16. november 2003 - 19:41 #13
Ahh ok, det andet lød også lidt spøjst. Tak.
Avatar billede arne_v Ekspert
16. november 2003 - 19:57 #14
Iøvrigt er unsigned data typer nok det jeg savner allermest i Java.
Avatar billede jakoba Nybegynder
16. november 2003 - 20:21 #15
Var lige inde og checke om byte virkelig var en signed type (og arne-v har søreme ret, det er det.)

men kik her: en meget nemmere måde at stoppe et hex-tal i en integer:
    public static final int  MIN_VALUE = 0x80000000;
skrevet med hexnotation ('0x' forrest) bliver det bare læst ind selvom resultatet er negativt.
Avatar billede nielsbrinch Nybegynder
16. november 2003 - 20:52 #16
Jeg tror ikke jeg forstår. Hvad er måden?
Avatar billede jakoba Nybegynder
16. november 2003 - 21:09 #17
måden var et håb om at det kunne bruges; men det duer kun på compiletime. til runtime får jeg den samme exception som du når det ikke er arnes linie.
Avatar billede nielsbrinch Nybegynder
17. november 2003 - 23:03 #18
Jeg har fået at vide at 46821303 skal give 02ca6fb7 i hexadecimale tal, men når jeg bruger Integer.toHexString(46821303) får jeg 2ca6fb7.

Kan man altid bare sætte 0 foran et hexadecimalt tal, og så tæller det ikke med, ligesom ved almindelige tal (0034 er det samme som 34)?
Avatar billede arne_v Ekspert
17. november 2003 - 23:08 #19
0x1 og 0x00000001 er samme tal.

0034 er 28 (tal der starter med nul er oktaler)
Avatar billede nielsbrinch Nybegynder
17. november 2003 - 23:20 #20
ok, tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester