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.
0xAA0F245C = 2853119068
masInteger.MAX_VALUE = 0x7fffffff = 2147483647
Integer.parseUnsignedInt("value",radix)
método que serve ao seu propósito. Se o valor for maior do queInteger.MAX_VALUE
ele é mapeado para um número negativo.Respostas:
É simplesmente muito grande para um int (que tem 4 bytes e é assinado).
Usar
fonte
NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"
... Solução?BigInteger
classe desta forma:BigInteger value = new BigInteger(valueString, 16)
você pode usar assim
fonte
O valor máximo que um Java
Integer
pode manipular é 2147483657 ou 2 ^ 31-1. O número hexadecimal AA0F245C é 2853119068 como um número decimal e é muito grande, então você precisa usarpara fazer funcionar.
fonte
você pode fazer isso facilmente com parseInt com parâmetro de formato.
javadoc inteiro
fonte
Esta é a resposta certa:
myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)
fonte
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.
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.
fonte
Uma opção adicional às sugeridas é a utilização da
BigInteger
aula. Uma vez que os valores hexadecimais são frequentemente números grandes, como valores sha256 ou sha512, eles facilmente transbordarãoint
e umlong
. Embora a conversão para um array de bytes seja uma opção, como mostram outras respostasBigInterger
, a classe frequentemente esquecida em java também é uma opção.fonte
fonte
Experimente com isto:
longo abc = convertString2Hex ("1A2A3B");
fonte