Ich versuche, eine Zeichenfolge mit 8 Zeichen Hex-Code in eine Ganzzahl umzuwandeln, damit ich einen Int-Vergleich anstelle von Zeichenfolgenvergleichen über viele verschiedene Werte durchführen kann.
Ich weiß, dass dies in C ++ ziemlich trivial ist, aber ich muss es in Java tun. Der Testfall, den ich erfüllen muss, besteht im Wesentlichen darin, "AA0F245C" in int und dann zurück in diesen String zu konvertieren, damit ich weiß, dass er richtig konvertiert.
Ich habe folgendes versucht:
int decode = Integer.decode("0xAA0F245C"); // NumberFormatException
int decode2 = Integer.decode("AA0F245C"); //NumberFormatException
int parseInt = Integer.parseInt("AA0F245C", 16); //NumberFormatException
int valueOf = Integer.valueOf("AA0F245C", 16); //NumberFormatException
Ich habe auch versucht, zwei Zeichen gleichzeitig zu machen und die Ergebnisse zu multiplizieren, was bei der Konvertierung funktioniert, aber die Zahl stimmt nicht.
int id = 0;
for (int h = 0; h < hex.length(); h= h+2)
{
String sub = hex.subSequence(h, h+2).toString();
if (id == 0)
id = Integer.valueOf(sub, 16);
else
id *= Integer.valueOf(sub, 16);
}
//ID = 8445600 which = 80DEA0 if I convert it back.
Ich kann keine Bibliotheken von Drittanbietern verwenden, nur damit Sie wissen, dass dies in Java-Standardbibliotheken erfolgen muss.
Danke im Voraus für Ihre Hilfe.
0xAA0F245C = 2853119068
aberInteger.MAX_VALUE = 0x7fffffff = 2147483647
Integer.parseUnsignedInt("value",radix)
Methode hinzugefügt , die Ihrem Zweck dient. Wenn der Wert größer ist alsInteger.MAX_VALUE
er, wird er einer negativen Zahl zugeordnet.Antworten:
Es ist einfach zu groß für ein int (das 4 Bytes ist und signiert).
Verwenden
quelle
NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"
... Lösung?BigInteger
Klasse wie folgt zu verwenden :BigInteger value = new BigInteger(valueString, 16)
Sie können so verwenden
quelle
Der maximale Wert, den ein Java verarbeiten
Integer
kann, ist 2147483657 oder 2 ^ 31-1. Die Hexadezimalzahl AA0F245C ist 2853119068 als Dezimalzahl und viel zu groß, sodass Sie sie verwenden müssendamit es funktioniert.
quelle
Sie können dies einfach mit parseInt mit dem Formatparameter tun.
Javadoc Integer
quelle
Das ist die richtige Antwort:
myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)
quelle
Für diejenigen unter Ihnen, die die hexadezimale Darstellung eines vorzeichenbehafteten Bytes aus einem zweistelligen String in ein Byte konvertieren müssen (das in Java immer signiert ist), gibt es ein Beispiel. Das Parsen einer hexadezimalen Zeichenfolge ergibt niemals eine negative Zahl, was fehlerhaft ist, da 0xFF unter bestimmten Gesichtspunkten -1 ist (Zweierkomplementcodierung). Das Prinzip besteht darin, den eingehenden String als int zu analysieren, das größer als das Byte ist, und dann negative Zahlen zu umbrechen. Ich zeige nur Bytes, daher ist dieses Beispiel kurz genug.
Dies kann bearbeitet werden, um längere Nummern zu verarbeiten. Fügen Sie einfach weitere FFs bzw. 00s hinzu. Zum Parsen von 8 Ganzzahlen mit Hex-Zeichen müssen Sie Long.parseLong verwenden, da FFFF-FFFF (Ganzzahl -1) nicht in Integer passt, wenn es als positive Zahl dargestellt wird (ergibt 4294967295). Sie brauchen also Long, um es zu speichern. Nach der Konvertierung in eine negative Zahl und dem Zurücksetzen in eine Ganzzahl passt es. Es gibt keine 8-stellige Hex-Zeichenfolge, die am Ende nicht in eine Ganzzahl passt.
quelle
Eine zusätzliche Option zu den vorgeschlagenen ist die Verwendung der
BigInteger
Klasse. Da Hex-Werte häufig große Zahlen sind, wie z. B. sha256- oder sha512-Werte, können sie leicht anint
und a überlaufenlong
. Während die Konvertierung in ein Byte-Array eine Option ist, wie andere Antworten zeigen,BigInterger
ist die häufig vergessene Klasse in Java ebenfalls eine Option.quelle
quelle
Versuchen Sie es damit:
long abc = convertString2Hex ("1A2A3B");
quelle