Entero a hexadecimal de dos dígitos en Java

82

Necesito cambiar un valor entero en un valor hexadecimal de 2 dígitos en Java. ¿Hay alguna forma de hacerlo? Gracias

Mi mayor número será 63 y el menor será 0. Quiero un cero a la izquierda para valores pequeños.

Salih Erikci
fuente
¿Necesitas imprimirlo? ¿Necesitas convertirlo en una cuerda?
Ahmed Masud
Escribiré en el archivo como hexadecimal de dos dígitos
Salih Erikci
¿Ha comprobado al menos el javadoc Integer? ¿Cómo planea convertir 12345656 a un valor hexadecimal de 2 dígitos?
JB Nizet

Respuestas:

147
String.format("%02X", value);

Si usa en Xlugar de x lo sugerido por aristar , entonces no necesita usar .toUpperCase().

GabrielOshiro
fuente
8
Esta es la mejor respuesta en la actualidad.
David J.
1
De acuerdo, este es mucho mejor que cualquiera de los demás. Funciona perfectamente. Lo único que sugeriría es una descripción un poco más de los parámetros pasados ​​al método. Tuve que buscar si pasaba el valor como un número entero o como una cadena hexadecimal.
JRSofty
31
Integer.toHexString(42);

Javadoc: http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#toHexString(int)

Sin embargo, tenga en cuenta que esto puede proporcionarle más de 2 dígitos. (Un entero tiene 4 bytes, por lo que potencialmente podría recuperar 8 caracteres).

Aquí hay un truco para obtener su relleno, siempre que esté absolutamente seguro de que solo está tratando con valores de un solo byte (255 o menos):

Integer.toHexString(0x100 | 42).substring(1)

Muchas más (y mejores) soluciones en el relleno izquierdo de enteros (formato no decimal) con ceros en Java .

ziesemer
fuente
3
Buen truco de zero padding :)
Grodriguez
1
Puede utilizar la misma técnica para valores más grandes. Si desea relleno para valores de hasta 2 bytes, puede hacer Integer.toHexString (0x10000 | value) .substring (1). Para N dígitos hexadecimales, agrega N 0 después del "1". Por supuesto, su valor hexadecimal no debe tener más de N dígitos.
user823981
28
String.format("%02X", (0xFF & value));    
aristar
fuente
7
¿Alguien puede explicar por qué esto funciona de forma bit a bit y con 0xFF? Es por eso que las respuestas en SO no deberían ser solo el código
Stealth Rabbi
4
El valor OxFF & (byte) simplemente convierte el byte firmado en sin firmar. (int) -1 = 0xFFFFFFFF, (int) (- 1 y 0xFf) = 0xFF
aristar
En este caso, el bit a bit y con 0xFF no es necesario debido al formato "% 02X".
Freek de Bruijn
1
El especificador% 02X especifica un mínimo de dos dígitos. Si desea exactamente dos dígitos (descartando bits más altos), entonces necesita el bit a bit y.
Plugwash
Es bueno saberlo, ¡gracias por esta información adicional!
tryp
14

Utilice Integer.toHexString(). No olvide rellenar con un cero a la izquierda si solo termina con un dígito. Si su número entero es mayor que 255 obtendrá más de 2 dígitos.

StringBuilder sb = new StringBuilder();
sb.append(Integer.toHexString(myInt));
if (sb.length() < 2) {
    sb.insert(0, '0'); // pad with leading zero if needed
}
String hex = sb.toString();
Asaph
fuente
2
¿Es el uso de StringBuilderrealmente una mejora? pastebin.com/KyS06JMz
acaba de leer el
4

Si solo necesita imprimirlos, intente esto:

for(int a = 0; a < 255; a++){
    if( a % 16 == 0){
        System.out.println();
    }
    System.out.printf("%02x ", a);
}
java4loop
fuente
0

uso esto para obtener una cadena que representa el valor hexadecimal equivalente de un número entero separado por espacio para cada byte EX: valor hexadecimal de 260 en 4 bytes = 00 00 01 04

    public static String getHexValString(Integer val, int bytePercision){
    StringBuilder sb = new StringBuilder();
    sb.append(Integer.toHexString(val));

    while(sb.length() < bytePercision*2){
        sb.insert(0,'0');// pad with leading zero
    }

    int l = sb.length(); // total string length before spaces
    int r = l/2; //num of rquired iterations

    for (int i=1; i < r;  i++){
        int x = l-(2*i); //space postion
        sb.insert(x, ' ');
    }
    return sb.toString().toUpperCase();         
}

public static void main(String []args){
    System.out.println("hex val of 260 in 4 bytes = " + getHexValString(260,4));
}
Mohamed Abd El Raouf
fuente
0

Según GabrielOshiro, si desea un formato entero de longitud 8, intente esto

String.format("0x%08X", 20) //print 0x00000014
Víctor Choy
fuente