2014-06-25 21 views
9

Frage ist Wie konvertiere ich ByteArray in GUID.Konvertieren von ByteArray in UUID Java

Zuvor konvertierte ich meine GUID in Byte-Array, und nach einer Transaktion brauche ich meine GUID zurück aus Byte-Array. Wie mache ich das. Obwohl irrelevant, aber Umwandlung von Guid zu Byte [] ist wie unten

public static byte[] getByteArrayFromGuid(String str) 
    { 
     UUID uuid = UUID.fromString(str); 
     ByteBuffer bb = ByteBuffer.wrap(new byte[16]); 
     bb.putLong(uuid.getMostSignificantBits()); 
     bb.putLong(uuid.getLeastSignificantBits()); 

     return bb.array(); 
    } 

aber wie kann ich es zurück konvertieren ??

habe ich versucht, diese Methode aber die mich nicht denselben Wert zurück

public static String getGuidFromByteArray(byte[] bytes) 
    { 
     UUID uuid = UUID.nameUUIDFromBytes(bytes); 
     return uuid.toString(); 
    } 

Jede Hilfe geschätzt wird.

Antwort

17

Die Methode nameUUIDFromBytes() konvertiert einen Namen in eine UUID. Intern wurde Hashing und etwas schwarze Magie angewendet, um einen beliebigen Namen (d. H. Eine Zeichenfolge) in eine gültige UUID umzuwandeln.

Sie müssen den new UUID(long, long); Konstruktor statt:

public static String getGuidFromByteArray(byte[] bytes) { 
    ByteBuffer bb = ByteBuffer.wrap(bytes); 
    long high = bb.getLong(); 
    long low = bb.getLong(); 
    UUID uuid = new UUID(high, low); 
    return uuid.toString(); 
} 

Aber da Sie die UUID Objekt nicht benötigen, können Sie einfach einen Hex-Dump tun:

public static String getGuidFromByteArray(byte[] bytes) { 
    StringBuilder buffer = new StringBuilder(); 
    for(int i=0; i<bytes.length; i++) { 
     buffer.append(String.format("%02x", bytes[i])); 
    } 
    return buffer.toString(); 
} 
+2

+1 für Erklärung: _Special_ für Hashing und einige _black magic_ :) –

+1

Um genauer zu sein über die "schwarze Magie" (die nicht wirklich aufklärt, was wirklich passiert), werfen Sie einen Blick auf http: // docs. oracle.com/javase/7/docs/api/java/util/UUID.html. Namentlich kann 'public UUID (long mostSigBits, long least letterSigBits)' jede Art von UUID, die Sie wollen, konstruieren. Es kann wahrscheinlich sogar ungültige UUIDs mit anderen Typen als 1, 2, 3 oder 4 machen - aber das habe ich nicht verifiziert. 'nameUUIDFromBytes' erstellt nur eine UUID vom Typ 3. –

7

Versuchen:

public static String getGuidFromByteArray(byte[] bytes) { 
    ByteBuffer bb = ByteBuffer.wrap(bytes); 
    UUID uuid = new UUID(bb.getLong(), bb.getLong()); 
    return uuid.toString(); 
} 

Ihr Problem ist, dass UUID.nameUUIDFromBytes(...) schafft nur 3 UUIDs geben, aber Sie wollen jeden UUID-Typen.

+0

Wenn es 8 oder 16 Bytes, es wird funktionieren. Was wäre passiert, wenn es 4 Bytes hat. Ich denke, es wird abstürzen (java.nio.bufferoverflowexception). Wie können wir das beheben? – mindus

+1

@mindus Eine UUID ist [definiert, um 128 Bits (16 Bytes) zu haben] (http://en.wikipedia.org/wiki/Universally_unique_identifier#Definition). Wenn Sie nur die ersten 32 Bits haben, gibt es keine Möglichkeit, das zu "reparieren". Vielleicht möchten Sie die Eingabeüberprüfung hinzufügen und eine "IllegalArgumentException" auslösen, wenn die Eingabe! = 16 Byte ist. – haraldK

1

Versuchen gleiche Verfahren in umgekehrter Reihenfolge vorgehen:

public static String getGuidFromByteArray(byte[] bytes) 
{ 
    ByteBuffer bb = ByteBuffer.wrap(bytes); 
    UUID uuid = new UUID(bb.getLong(), bb.getLong()); 
    return uuid.toString(); 
} 

sowohl für Gebäude und Parsen Ihrer byte [], die Sie wirklich die byte order berücksichtigen müssen.

+0

Perfekt. Funktioniert für mich – Android

+0

Wenn es 8 oder 16 Bytes ist, wird es funktionieren. Was wäre passiert, wenn es 4 Bytes hat. Ich denke, es wird abstürzen (java.nio.bufferoverflowexception). Wie können wir das beheben? – mindus