Converti la stringa esadecimale in int


111

Sto cercando di convertire una stringa lunga 8 caratteri di codice esadecimale in un numero intero in modo da poter eseguire il confronto int invece di confronti di stringhe su molti valori diversi.

So che è abbastanza banale in C ++ ma ho bisogno di farlo in Java. Il test case che devo soddisfare è essenzialmente quello di convertire "AA0F245C" in int e poi di nuovo in quella stringa in modo che io sappia che sta convertendo correttamente.

Ho provato quanto segue:

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

Ho anche provato a farlo due caratteri alla volta e moltiplicando i risultati, che la conversione funziona ma il numero non è corretto.

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. 

Non posso usare le librerie di terze parti solo per quello che sai, quindi questo deve essere fatto nelle librerie standard di Java.

Grazie in anticipo per il tuo aiuto.


Ti stai moltiplicando quando dovresti cambiare.
Nathan Moinvaziri

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

5
So che la domanda esiste da due anni. Tuttavia, Java 8 consente un'altra soluzione. Hanno aggiunto il Integer.parseUnsignedInt("value",radix)metodo che serve al tuo scopo. Se il valore è maggiore Integer.MAX_VALUEviene mappato a un numero negativo.
John

Risposte:


151

È semplicemente troppo grande per un int (che è di 4 byte e firmato).

Uso

Long.parseLong("AA0F245C", 16);

4
Fantastico grazie! Probabilmente avrei dovuto saperlo. Ma mi fa sentire meglio, nessuna delle 4 persone che ho chiesto prima di postare lo sapeva :). Come nota a margine, ora devo andare a capire perché la persona ha scritto il codice di cui ho bisogno per confrontare gli int per averli come int e non lunghi ... il che probabilmente significa che qualcos'altro è spento. Questo è oltre il punto ... grazie per la rapida risposta !!!! Ti maledico anche Java per il tuo terribile messaggio di errore ... "È troppo grande" sarebbe stato utile.
Roloc

Quando provo con una stringa esadecimale grande, ottengo NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"... Soluzione?
Anum Sheraz

@AnumSheraz non vuoi convertire in un long ma in un array di byte. Vedi ad esempio stackoverflow.com/questions/140131/…
Denys Séguret

Un'alternativa alla conversione in un array di byte per un numero elevato è usare la BigIntegerclasse in questo modo:BigInteger value = new BigInteger(valueString, 16)
Javaru

33

puoi usare così

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

1
mi piace questa risposta, non sapevo che ci fosse un metodo generico e sensibile al tipo per questo nella classe Integer. grazie per la conoscenza.
Gewure

18

Il valore massimo che un Java Integerpuò gestire è 2147483657 o 2 ^ 31-1. Il numero esadecimale AA0F245C è 2853119068 come numero decimale ed è troppo grande, quindi è necessario utilizzare

Long.parseLong("AA0F245C", 16);

per farlo funzionare.


off: interessante il fatto che una risposta più dettagliata anche se 5 minuti dopo ottiene solo 1 voto positivo rispetto a 14. Anche se vero, questo non diceva "4 byte" e "firmato" magici ... hm.
n611x007


5

Questa è la risposta esatta:

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


3

Per quelli di voi che hanno bisogno di convertire la rappresentazione esadecimale di un byte con segno da una stringa di due caratteri in byte (che in Java è sempre firmato), c'è un esempio. L'analisi di una stringa esadecimale non fornisce mai un numero negativo, il che è errato, perché 0xFF è -1 da un certo punto di vista (codifica in complemento a due). Il principio è analizzare la stringa in arrivo come int, che è più grande di byte, quindi avvolgere i numeri negativi. Sto mostrando solo byte, quindi questo esempio è abbastanza breve.

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

Questo può essere modificato per elaborare numeri più lunghi. Basta aggiungere più FF o 00 rispettivamente. Per analizzare 8 interi con segno esadecimale, è necessario utilizzare Long.parseLong, perché FFFF-FFFF, che è intero -1, non si adatterebbe a Integer se rappresentato come un numero positivo (fornisce 4294967295). Quindi hai bisogno di molto tempo per conservarlo. Dopo la conversione in numero negativo e il cast di nuovo a Integer, si adatterà. Non esiste una stringa esadecimale di 8 caratteri, che alla fine non starebbe con un intero.


1

Un'opzione aggiuntiva rispetto a quelle suggerite è quella di utilizzare la BigIntegerclasse. Poiché i valori esadecimali sono spesso numeri grandi, come i valori sha256 o sha512, supereranno facilmente un inte a long. Mentre la conversione in un array di byte è un'opzione come mostrano altre risposte BigInterger, anche la classe spesso dimenticata in java è un'opzione.

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

Prova con questo:

abc lungo = 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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.