Estoy tratando de convertir una cadena que tiene 8 caracteres de código hexadecimal en un número entero para poder hacer una comparación int en lugar de comparaciones de cadenas sobre muchos valores diferentes.
Sé que esto es bastante trivial en C ++, pero necesito hacerlo en Java. El caso de prueba que necesito satisfacer es esencialmente Convertir "AA0F245C" a int y luego volver a esa cadena para saber que se está convirtiendo correctamente.
He probado lo siguiente:
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
También he intentado hacerlo dos caracteres a la vez y multiplicar los resultados, que funciona la conversión pero el número no es correcto.
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.
No puedo usar bibliotecas de terceros solo para que lo sepas, por lo que esto debe hacerse en las bibliotecas estándar de Java.
De forma anticipada, muchas gracias por su ayuda.
0xAA0F245C = 2853119068
peroInteger.MAX_VALUE = 0x7fffffff = 2147483647
Integer.parseUnsignedInt("value",radix)
método que sirve a su propósito. Si el valor es mayorInteger.MAX_VALUE
, se asigna a un número negativo.Respuestas:
Es simplemente demasiado grande para un int (que tiene 4 bytes y está firmado).
Utilizar
fuente
NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"
... ¿Solución?BigInteger
clase como esta:BigInteger value = new BigInteger(valueString, 16)
puedes usar así
fuente
El valor máximo que
Integer
puede manejar un Java es 2147483657 o 2 ^ 31-1. El número hexadecimal AA0F245C es 2853119068 como número decimal, y es demasiado grande, por lo que debe usarpara que funcione.
fuente
puede hacerlo fácilmente con parseInt con parámetro de formato.
javadoc entero
fuente
Esta es la respuesta correcta:
myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)
fuente
Para aquellos de ustedes que necesitan convertir la representación hexadecimal de un byte con signo de una cadena de dos caracteres en un byte (que en Java siempre está firmado), hay un ejemplo. Analizar una cadena hexadecimal nunca da un número negativo, lo cual es defectuoso, porque 0xFF es -1 desde algún punto de vista (codificación de complemento a dos). El principio es analizar la cadena entrante como int, que es más grande que un byte, y luego envolver números negativos. Solo muestro bytes, por lo que ese ejemplo es lo suficientemente corto.
Esto se puede editar para procesar números más largos. Simplemente agregue más FF o 00 respectivamente. Para analizar 8 enteros con signo de caracteres hexadecimales, debe utilizar Long.parseLong, porque FFFF-FFFF, que es un entero -1, no encajaría en Integer cuando se representa como un número positivo (da 4294967295). Entonces necesitas Long para almacenarlo. Después de la conversión a un número negativo y volver a convertirlo en Integer, encajará. No hay una cadena hexadecimal de 8 caracteres, que no se ajusta a un número entero al final.
fuente
Una opción adicional a las sugeridas es utilizar la
BigInteger
clase. Dado que los valores hexadecimales suelen ser números grandes, como los valores sha256 o sha512, se desbordarán fácilmente de unint
y unlong
. Si bien la conversión a una matriz de bytes es una opción, como muestran otras respuestasBigInterger
, la clase a menudo olvidada en java también es una opción.fuente
fuente
Prueba con esto:
long abc = convertString2Hex ("1A2A3B");
fuente