Converter string hexadecimal para int

111

Estou tentando converter uma string de 8 caracteres de código hexadecimal em um número inteiro para que eu possa fazer uma comparação interna em vez de comparações de string em vários valores diferentes.

Eu sei que isso é bastante trivial em C ++, mas preciso fazer isso em Java. O caso de teste que preciso satisfazer é essencialmente converter "AA0F245C" em int e, em seguida, voltar para aquela string para que eu saiba que está convertendo corretamente.

Eu tentei o seguinte:

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

Também tentei fazer dois caracteres por vez e multiplicar os resultados, a conversão funciona, mas o número não está certo.

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. 

Não posso usar bibliotecas de terceiros apenas para sua informação, então isso tem que ser feito em bibliotecas padrão Java.

Obrigado por sua ajuda com antecedência.

Roloc
fonte
Você está se multiplicando quando deveria estar mudando.
Nathan Moinvaziri
7
0xAA0F245C = 2853119068masInteger.MAX_VALUE = 0x7fffffff = 2147483647
Pshemo
5
Eu sei que a pergunta já existe há dois anos. No entanto, o java 8 permite outra solução. Eles adicionaram o Integer.parseUnsignedInt("value",radix)método que serve ao seu propósito. Se o valor for maior do que Integer.MAX_VALUEele é mapeado para um número negativo.
John

Respostas:

151

É simplesmente muito grande para um int (que tem 4 bytes e é assinado).

Usar

Long.parseLong("AA0F245C", 16);
Denys Séguret
fonte
4
Perfeito, obrigado! Eu provavelmente deveria saber disso. Mas me faz sentir melhor, nenhuma das 4 pessoas a quem perguntei antes de postar também sabia :). Como observação lateral, agora preciso descobrir por que a pessoa escreveu o código ao qual preciso comparar os ints com os ints e não longs ... o que provavelmente significa que algo mais está errado. Isso está além do ponto ... obrigado pela resposta rápida !!!! Também amaldiçoado java por sua terrível mensagem de erro ... "É muito grande" teria sido útil.
Roloc de
Quando tento usar uma string hexadecimal grande, obtenho NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"... Solução?
Anum Sheraz
@AnumSheraz você não deseja converter para um array longo, mas sim para um array de bytes. Veja, por exemplo, stackoverflow.com/questions/140131/…
Denys Séguret
Uma alternativa para converter em uma matriz de bytes para um grande número é usar a BigIntegerclasse desta forma:BigInteger value = new BigInteger(valueString, 16)
Javaru
33

você pode usar assim

System.out.println(Integer.decode("0x4d2"))    // output 1234
//and vice versa 
System.out.println(Integer.toHexString(1234); //  output is 4d2);
manikant gautam
fonte
1
gostei da resposta, não sabia que existe um método genérico insensível ao tipo para isso na classe Integer. obrigado pelo conhecimento.
Gewure
18

O valor máximo que um Java Integerpode manipular é 2147483657 ou 2 ^ 31-1. O número hexadecimal AA0F245C é 2853119068 como um número decimal e é muito grande, então você precisa usar

Long.parseLong("AA0F245C", 16);

para fazer funcionar.

Incompl
fonte
off: interessante que uma resposta mais detalhada, embora 5 minutos depois, tenha apenas 1 upvote em comparação com 14. Embora seja verdade, este não disse '4 bytes' e 'assinado' mágicos ... hm.
n611x007,
9

você pode fazer isso facilmente com parseInt com parâmetro de formato.

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

javadoc inteiro

calor
fonte
o link está quebrado
odinthenerd
5

Esta é a resposta certa:

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

HannahCarney
fonte
3

Para aqueles de vocês que precisam converter a representação hexadecimal de um byte assinado de String de dois caracteres em byte (que em Java é sempre assinado), há um exemplo. Analisar uma string hexadecimal nunca dá um número negativo, o que é incorreto, porque 0xFF é -1 de algum ponto de vista (codificação de complemento de dois). O princípio é analisar a string de entrada como int, que é maior do que um byte, e então envolver os números negativos. Estou mostrando apenas bytes, então esse exemplo é curto o suficiente.

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

Isso pode ser editado para processar números mais longos. Basta adicionar mais FFs ou 00s respectivamente. Para analisar 8 inteiros com sinal de caracteres hexadecimais, você precisa usar Long.parseLong, porque FFFF-FFFF, que é inteiro -1, não caberia em Integer quando representado como um número positivo (dá 4294967295). Então você precisa de Long para armazená-lo. Após a conversão para número negativo e convertido de volta para o número inteiro, ele se ajustará. Não há uma string hexadecimal de 8 caracteres, que não caberia em um inteiro no final.

JanSmrz
fonte
1

Uma opção adicional às sugeridas é a utilização da BigIntegeraula. Uma vez que os valores hexadecimais são frequentemente números grandes, como valores sha256 ou sha512, eles facilmente transbordarãoint e um long. Embora a conversão para um array de bytes seja uma opção, como mostram outras respostas BigInterger, a classe frequentemente esquecida em java também é uma opção.

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266
Javaru
fonte
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
fonte
0

Experimente com isto:

longo 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
fonte