Ganzzahl auf zwei Ziffern hex in Java


82

Ich muss einen ganzzahligen Wert in Java in einen zweistelligen Hex-Wert ändern. Gibt es dafür eine Möglichkeit? Vielen Dank

Meine größte Zahl ist 63 und die kleinste ist 0. Ich möchte eine führende Null für kleine Werte.


Sie müssen es drucken? Sie müssen es in eine Zeichenfolge verwandeln?
Ahmed Masud

Ich werde als zweistelliges Hex in die Datei schreiben
Salih Erikci

Haben Sie zumindest das Integer-Javadoc überprüft? Wie planen Sie, 12345656 in einen zweistelligen Hex-Wert umzuwandeln?
JB Nizet

Antworten:


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

Wenn Sie Xanstelle von x wie von Aristar vorgeschlagen verwenden , müssen Sie nicht verwenden .toUpperCase().


8
Dies ist derzeit die beste Antwort.
David J.

1
Einverstanden, dass dieser viel besser ist als jeder der anderen. Es funktioniert perfekt. Das einzige, was ich vorschlagen würde, ist eine etwas genauere Beschreibung der an die Methode übergebenen Parameter. Ich musste nachschlagen, ob ich den Wert als Ganzzahl oder als Hex-Zeichenfolge übergeben habe.
JRSofty

31
Integer.toHexString(42);

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

Beachten Sie jedoch, dass Sie dadurch möglicherweise mehr als 2 Ziffern erhalten! (Eine Ganzzahl besteht aus 4 Bytes, sodass Sie möglicherweise 8 Zeichen zurückerhalten können.)

Hier ist ein kleiner Hack, um Ihre Auffüllung zu erhalten, solange Sie absolut sicher sind, dass Sie nur mit Einzelbyte-Werten (255 oder weniger) arbeiten:

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

Viele weitere (und bessere) Lösungen bei Left Padding Integer (Nicht-Dezimal-Format) mit Nullen in Java .


3
Netter Zero-Padding-Hack :)
Grodriguez

1
Sie können dieselbe Technik für größere Werte verwenden. Wenn Sie bis zu 2-Byte-Werte auffüllen möchten, können Sie Integer.toHexString (0x10000 | value) .substring (1) ausführen. Für N hexadezimale Ziffern fügen Sie N 0s nach der "1" hinzu. Natürlich darf Ihr Hex-Wert nicht mehr als N Ziffern haben.
user823981

28
String.format("%02X", (0xFF & value));    

7
Kann jemand erklären, warum dies ein bisschen weise und mit 0xFF ist? Aus diesem Grund sollten Antworten auf SO nicht nur der Code sein
Stealth Rabbi

4
Der OxFF & (Byte) -Wert konvertiert nur das vorzeichenbehaftete Byte in ein vorzeichenloses. (int) -1 = 0xFFFFFFFF, (int) (- 1 & 0xFf) = 0xFF
Aristar

In diesem Fall ist das bitweise und mit 0xFF aufgrund des "% 02X" -Formats nicht erforderlich.
Freek de Bruijn

1
Der% 02X-Bezeichner gibt mindestens zwei Ziffern an. Wenn Sie genau zwei Ziffern möchten (höhere Bits verwerfen), benötigen Sie das bitweise und.
Plugwash

Gut zu wissen, danke für diese zusätzlichen Informationen!
Tryp

14

Verwenden Sie Integer.toHexString(). Vergessen Sie nicht, mit einer führenden Null aufzufüllen, wenn Sie nur eine Ziffer haben. Wenn Ihre Ganzzahl größer als 255 ist, erhalten Sie mehr als 2 Ziffern.

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();

2
Ist die Verwendung StringBuildertatsächlich eine Verbesserung? pastebin.com/KyS06JMz
gerade lerning

4

Wenn Sie sie nur drucken müssen, versuchen Sie Folgendes:

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

0

Ich benutze dies, um eine Zeichenfolge zu erhalten, die den äquivalenten Hex-Wert einer durch Leerzeichen getrennten Ganzzahl für jedes Byte EX darstellt: Hex-Wert von 260 in 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));
}

0

Laut GabrielOshiro versuchen Sie dies, wenn Sie eine Ganzzahl bis zur Länge 8 formatieren möchten

String.format("0x%08X", 20) //print 0x00000014
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.