171 Stimmen

Wie konvertiere ich in Java ein Byte-Array in eine Zeichenkette aus Hex-Ziffern, wobei führende Nullen erhalten bleiben?

Ich arbeite mit einigen Beispiel-Java-Code für die Herstellung von md5 Hashes. Ein Teil wandelt die Ergebnisse von Bytes in eine Zeichenkette aus Hex-Ziffern um:

byte messageDigest[] = algorithm.digest();     
StringBuffer hexString = new StringBuffer();
for (int i=0;i<messageDigest.length;i++) {
    hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
    }

Es funktioniert jedoch nicht ganz, da toHexString offenbar führende Nullen abschneidet. Also, was ist der einfachste Weg, um von Byte-Array zu Hex-String, die die führenden Nullen behält gehen?

6voto

kichik Punkte 30440

Guave macht es auch ziemlich einfach:

BaseEncoding.base16().encode( bytes );

Es ist eine gute Alternative, wenn Apache Commons nicht verfügbar ist. Es hat auch einige schöne Kontrollen der Ausgabe wie:

byte[] bytes = new byte[] { 0xa, 0xb, 0xc, 0xd, 0xe, 0xf };
BaseEncoding.base16().lowerCase().withSeparator( ":", 2 ).encode( bytes );
// "0a:0b:0c:0d:0e:0f"

5voto

agentbillo Punkte 51

Diese Lösung ist ein wenig älter und sollte speichereffizient sein.

public static String toHexString(byte bytes[]) {
    if (bytes == null) {
        return null;
    }

    StringBuffer sb = new StringBuffer();
    for (int iter = 0; iter < bytes.length; iter++) {
        byte high = (byte) ( (bytes[iter] & 0xf0) >> 4);
        byte low =  (byte)   (bytes[iter] & 0x0f);
        sb.append(nibble2char(high));
        sb.append(nibble2char(low));
    }

    return sb.toString();
}

private static char nibble2char(byte b) {
    byte nibble = (byte) (b & 0x0f);
    if (nibble < 10) {
        return (char) ('0' + nibble);
    }
    return (char) ('a' + nibble - 10);
}

5voto

Peter Lawrey Punkte 511323

Eine weitere Option

public static String toHexString(byte[]bytes) {
    StringBuilder sb = new StringBuilder(bytes.length*2);
    for(byte b: bytes)
      sb.append(Integer.toHexString(b+0x800).substring(1));
    return sb.toString();
}

4voto

max Punkte 41
static String toHex(byte[] digest) {
    String digits = "0123456789abcdef";
    StringBuilder sb = new StringBuilder(digest.length * 2);
    for (byte b : digest) {
        int bi = b & 0xff;
        sb.append(digits.charAt(bi >> 4));
        sb.append(digits.charAt(bi & 0xf));
    }
    return sb.toString();
}

0 Stimmen

Ich wäre sehr daran interessiert zu sehen, wie dies im Vergleich zu Jemenakes Lösung aussieht

4voto

F.X Punkte 159

Um führende Nullen beizubehalten, ist hier eine kleine Variation dessen, was Paul vorgeschlagen hat (z. B. md5-Hash):

public static String MD5hash(String text) throws NoSuchAlgorithmException {
    byte[] hash = MessageDigest.getInstance("MD5").digest(text.getBytes());
    return String.format("%032x",new BigInteger(1, hash));
}

Ups, das sieht schlechter aus als das, was Ayman vorgeschlagen hat, sorry dafür

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X