2014-06-25 60 views
9

Soru: ByteArray'ı GUID'e nasıl dönüştürebilirim.ByteArray öğesini UUID java'ya dönüştürme

Önceden, yönergemi bayt dizisine dönüştürdüm ve bazı işlemlerden sonra, kılavuzumun bayt dizisinden geri dönmesine ihtiyacım var. Bunu nasıl yaparım. Guid alakasız ama dönüşüm byte rağmen []

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

aşağıda gibidir ama nasıl onu geri dönüştürebilirim ??

ben bu yöntemi denedim ama onun bana Herhangi bir yardım takdir edilecektir

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

aynı değeri dönen değil.

cevap

17

nameUUIDFromBytes() yöntemi, bir adı UUID'ye dönüştürür. Dahili olarak, herhangi bir adı (yani bir dizeyi) geçerli bir UUID'ye dönüştürmek için karma ve kara kara büyü uyguladı.

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

Ama UUID nesne gerekmez çünkü, sadece bir altıgen dökümü yapabilirsiniz: o 8 veya 16 ise

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

Açıklama için: _Specially_ Hashing ve bazı _black magic_ :) –

+1

'Kara büyü' hakkında daha spesifik olmak gerekirse (gerçekten neyin gerçekleştiğini gerçekten açmaz), http: // docs'a bir göz atın. oracle.com/javase/7/docs/api/java/util/UUID.html. Yani, 'public UUID (uzun MostSigBits, en azından en azSigBits)' istediğiniz herhangi bir UUID'yi yapılandırabilir. Muhtemelen, 1, 2, 3 veya 4'ten farklı türlerde geçersiz UUID'ler yapabiliriz - ancak bunu doğrulamamışımdır. nameUUIDFromBytes 'yalnızca 3 UUID tipini oluşturacaktır. –

7

Dene:

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

Senin sorunun UUID.nameUUIDFromBytes(...) sadece 3 UUIDs tip oluşturur, ancak herhangi bir UUID türü istiyorum. tersten aynı işlemi yapıyor

+0

yerine new UUID(long, long); yapıcı kullanmalıdır bayt, işe yarayacak. 4 bayt varsa ne olurdu. Sanırım çökecek (java.nio.bufferoverflowexception). Bunu nasıl düzeltebiliriz? – mindus

+1

@mindus Bir UUID [128 bit (16 bayt)] olarak tanımlanmıştır (http://en.wikipedia.org/wiki/Universally_unique_identifier#Definition). Yalnızca ilk 32 bite sahipseniz, bunu "düzeltmek" için bir yol yoktur. Girdi doğrulaması eklemek ve giriş olsa bile bir 'IllegalArgumentException 'atmak isteyebilirsiniz = 16 bayt. – haraldK

1

Dene: bina ve [], gerçekten byte order dikkate almak gerekir sizin bayt ayrıştırma ikisi için

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

.

+0

Mükemmel. Benim için çalışır – Android

+0

8 veya 16 bayt ise, işe yarayacak. 4 bayt varsa ne olurdu. Sanırım çökecek (java.nio.bufferoverflowexception). Bunu nasıl düzeltebiliriz? – mindus