2012-06-25 36 views
78

Estoy tratando de convertir una cadena que tiene 8 caracteres de longitud de código hexadecimal en un entero para que pueda hacer comparaciones int en lugar de comparaciones de cadenas en una gran cantidad de valores diferentes.Convertir cadena hexadecimal a int

Sé que esto es bastante trivial en C++, pero tengo que hacerlo en Java. El caso de prueba que necesito satisfacer es esencialmente Convertir "AA0F245C" a int y luego volver a esa cadena para que sepa que está convirtiendo a la derecha.

he intentado 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 hacer que dos personajes a la vez y multiplicando los resultados, que las obras de 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 sepa, así que esto tiene que hacerse en las bibliotecas estándar de Java.

Gracias por su ayuda con anticipación.

+0

está multiplicando cuando debería estar cambiando. –

+7

'0xAA0F245C = 2853119068' pero' Integer.MAX_VALUE = 0x7fffffff = 2147483647' – Pshemo

+4

Sé que la pregunta ha existido durante dos años. Sin embargo, java 8 habilita otra solución. Agregaron el método 'Integer.parseUnsignedInt (" value ", radix)' que sirve para su propósito. Si el valor es mayor que 'Integer.MAX_VALUE', se asigna a un número negativo. – John

Respuesta

115

Simplemente es demasiado grande para un int (que tiene 4 bytes y está firmado).

Uso

Long.parseLong("AA0F245C", 16); 
+3

¡Impresionante gracias! Probablemente debería haberlo sabido. Pero me hace sentir mejor que ninguna de las 4 personas que pregunté antes de publicar lo sabía tampoco :). Como nota al margen, ahora tengo que averiguar por qué la persona escribió el código que necesito para comparar los enteros con los que tiene como enteros y no como anhelos ... lo que probablemente significa que algo más está apagado. Eso es además del punto ... gracias por la respuesta rápida !!!! También le maldigo java por su terrible mensaje de error ... "Es demasiado grande" hubiera sido útil. – Roloc

+1

'"Es demasiado grande" hubiera sido útil.' Java no es una mujer ... –

13

el valor máximo que una aplicación Java puede manejar Integer es 2147483657, o 2^31-1. El número hexadecimal es AA0F245C 2853119068 como un número decimal, y es demasiado grande, por lo que es necesario utilizar

Long.parseLong("AA0F245C", 16); 

para hacer que funcione.

+0

off: interesante que una respuesta más detallada, aunque 5 minutos más tarde, obtiene solo 1 voto activo comparado con 14. Aunque es cierto, este no dice "4 bytes mágicos" y "firmado" ... hm. – n611x007

6

puede hacerlo fácilmente con parseInt con el parámetro de formato.

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

javadoc Integer

+4

¿Has probado eso con la cadena completa que publiqué? – Roloc

15

puede usar como la

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

Me gusta esta respuesta, no sabía que hay un método genérico y sensible a los tipos para esto en la clase Integer. gracias por el conocimiento. – Gewure

1

Esta es la respuesta correcta:

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