Konvertieren Sie eine Hex-Zeichenfolge in int


111

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.


Sie multiplizieren, wann Sie wechseln sollten.
Nathan Moinvaziri

7
0xAA0F245C = 2853119068aberInteger.MAX_VALUE = 0x7fffffff = 2147483647
Pshemo

5
Ich weiß, dass die Frage seit zwei Jahren besteht. Java 8 ermöglicht jedoch eine andere Lösung. Sie haben die Integer.parseUnsignedInt("value",radix)Methode hinzugefügt , die Ihrem Zweck dient. Wenn der Wert größer ist als Integer.MAX_VALUEer, wird er einer negativen Zahl zugeordnet.
John

Antworten:


151

Es ist einfach zu groß für ein int (das 4 Bytes ist und signiert).

Verwenden

Long.parseLong("AA0F245C", 16);

4
Geil, danke! Ich hätte das wahrscheinlich wissen müssen. Aber ich fühle mich besser, keiner der 4 Leute, die ich vor dem Posten gefragt habe, wusste es auch :). Als Randnotiz muss ich jetzt herausfinden, warum die Person den Code geschrieben hat, mit dem ich die Ints vergleichen muss, um sie als Ints und nicht als Longs zu haben ... was wahrscheinlich bedeutet, dass etwas anderes nicht stimmt. Das ist nicht der Punkt ... danke für die schnelle Antwort !!!! Verfluche auch Java für deine schreckliche Fehlermeldung ... "Es ist zu groß" wäre hilfreich gewesen.
Roloc

Wenn ich es mit einer großen Hex-Zeichenfolge versuche, bekomme ich NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"... Lösung?
Anum Sheraz

@AnumSheraz Sie möchten nicht in ein langes, sondern in ein Byte-Array konvertieren. Siehe zum Beispiel stackoverflow.com/questions/140131/…
Denys Séguret

Eine Alternative zur Konvertierung in ein Byte-Array für eine große Anzahl besteht darin, die BigIntegerKlasse wie folgt zu verwenden :BigInteger value = new BigInteger(valueString, 16)
Javaru

32

Sie können so verwenden

System.out.println(Integer.decode("0x4d2"))    // output 1234
//and vice versa 
System.out.println(Integer.toHexString(1234); //  output is 4d2);

1
Ich mag diese Antwort, wusste nicht, dass es dafür eine generische, typunempfindliche Methode in der Integer-Klasse gibt. danke für das wissen.
Gewure

18

Der maximale Wert, den ein Java verarbeiten Integerkann, ist 2147483657 oder 2 ^ 31-1. Die Hexadezimalzahl AA0F245C ist 2853119068 als Dezimalzahl und viel zu groß, sodass Sie sie verwenden müssen

Long.parseLong("AA0F245C", 16);

damit es funktioniert.


aus: interessant, dass eine detailliertere Antwort, wenn auch 5 Minuten später, nur 1 Gegenstimme im Vergleich zu 14 erhält. Obwohl dies wahr ist, hat diese nicht magische '4 Bytes' und 'Signiert' gesagt ... hm.
n611x007


5

Das ist die richtige Antwort:

myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)


3

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.

String inputTwoCharHex="FE"; //whatever your microcontroller data is

int i=Integer.parseInt(inputTwoCharHex,16);
//negative numbers is i now look like 128...255

// shortly i>=128
if (i>=Integer.parseInt("80",16)){

    //need to wrap-around negative numbers
    //we know that FF is 255 which is -1
    //and FE is 254 which is -2 and so on
    i=-1-Integer.parseInt("FF",16)+i;
    //shortly i=-256+i;
}
byte b=(byte)i;
//b is now surely between -128 and +127

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.


1

Eine zusätzliche Option zu den vorgeschlagenen ist die Verwendung der BigIntegerKlasse. Da Hex-Werte häufig große Zahlen sind, wie z. B. sha256- oder sha512-Werte, können sie leicht an intund a überlaufen long. Während die Konvertierung in ein Byte-Array eine Option ist, wie andere Antworten zeigen, BigIntergerist die häufig vergessene Klasse in Java ebenfalls eine Option.

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266

0
//Method for Smaller Number Range:
Integer.parseInt("abc",16);

//Method for Bigger Number Range.
Long.parseLong("abc",16);

//Method for Biggest Number Range.
new BigInteger("abc",16);

0

Versuchen Sie es damit:

long abc = convertString2Hex ("1A2A3B");

private  long  convertString2Hex(String numberHexString)
{
    char[] ChaArray = numberHexString.toCharArray();
    long HexSum=0;
    long cChar =0;

    for(int i=0;i<numberHexString.length();i++ )
    {
        if( (ChaArray[i]>='0') && (ChaArray[i]<='9') )
            cChar = ChaArray[i] - '0';
        else
            cChar = ChaArray[i]-'A'+10;
        HexSum = 16 * HexSum + cChar;
    }
    return  HexSum;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.