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.
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.
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:
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.
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.