Java negative int zu hex und zurück scheitert

8
%Vor%

Gibt

%Vor%

Was ist los?

    
Maxim Veksler 10.05.2009, 12:17
quelle

6 Antworten

10

Es ist dokumentiert, dass Integer.toHexString eine Zeichenfolgendarstellung der Ganzzahl als vorzeichenlosen Wert zurückgibt - während Integer.parseInt eine vorzeichenbehaftete Ganzzahl verwendet. Wenn Sie stattdessen Integer.toString(value, 16) verwenden, erhalten Sie, was Sie wollen.

    
dhn 10.05.2009, 12:54
quelle
12

Das hat mich immer genervt. Wenn Sie einen int mit einem Hex-Literal initialisieren, können Sie den gesamten Bereich der positiven Werte bis zu 0xFFFFFF ; alles was größer ist als 0x7FFFFF wird wirklich ein negativer Wert sein. Dies ist sehr praktisch für die Bitmaskierung und andere Operationen, bei denen Sie nur auf die Positionen der Bits achten, nicht auf deren Bedeutung.

Wenn Sie jedoch Integer.parseInt () zum Konvertieren einer Zeichenfolge in eine Ganzzahl verwenden, wird alles, was größer als "0x7FFFFFFF" ist, als Fehler behandelt. Es gibt wahrscheinlich einen guten Grund, warum sie es so gemacht haben, aber es ist immer noch frustrierend.

Die einfachste Problemumgehung besteht darin, stattdessen Long.parseLong () zu verwenden und das Ergebnis anschließend in int.

zu konvertieren %Vor%

Natürlich sollten Sie das nur tun, wenn Sie sicher sind, dass die Nummer im Bereich Integer.MIN_VALUE..Integer.MAX_VALUE liegt.

    
Alan Moore 10.05.2009 14:05
quelle
3

Laut der Dokumentation toHexString gibt "eine Zeichenfolgendarstellung des Integer-Arguments als eine vorzeichenlose Ganzzahl in der Basis 16 zurück."

Die korrekte umgekehrte Operation ist also wahrscheinlich Integer.parseUnsignedInt , das als Teil von Java 8 eingeführt wurde:

%Vor%     
Sylvain Leroux 06.12.2014 14:13
quelle
2

Versuchen Sie Folgendes:

%Vor%

}

um das zu bekommen:

%Vor%     
alphazero 10.05.2009 13:58
quelle
1

Sie müssen enthalten ein negatives Zeichen.

Ich habe momentan keinen Zugang, um das zu testen, aber ich würde wetten, wenn Sie stattdessen diesen Wert ausprobieren würden:

%Vor%

Es würde nicht bombardieren, aber würde dir eine positive Zahl geben (nicht negativ), wenn du ParseInt(min,16) ausgeführt hast.

Eine Zeichenfolge von Bits hat nicht wirklich genug Informationen, um das Zeichen in diesem Kontext zu bestimmen, daher müssen Sie es angeben. (Betrachte den Fall, in dem du min = "F" benutzt. Ist das +/- F? Wenn du es in Bits umgewandelt und 1111, und gesehen hast, wusstest du, dass es ein Byte ist aber das ist eine Menge Wenns.

    
Michael Haren 10.05.2009 12:20
quelle
0

Das scheint für mich zu funktionieren:

%Vor%

Die Ganzzahl wird als "signed long" analysiert, die eine so große positive Zahl behandelt, und dann wird das Zeichen zurück gefunden, indem es auf "int" geworfen wird.

    
Fabrice LARRIBE 27.11.2014 11:25
quelle

Tags und Links