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.

Roloc
quelle
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);
Denys Séguret
quelle
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);
manikant gautam
quelle
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.

Incompl
quelle
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
9

Sie können dies einfach mit parseInt mit dem Formatparameter tun.

Integer.parseInt("-FF", 16) ; // returns -255

Javadoc Integer

Hitze
quelle
Die Verbindung ist unterbrochen
odinthenerd
5

Das ist die richtige Antwort:

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

HannahCarney
quelle
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.

JanSmrz
quelle
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
Javaru
quelle
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);
Nitish Kumar
quelle
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;
}
Josko Marsic
quelle