2014-06-25 19 views
9

Câu hỏi là Làm cách nào để chuyển đổi ByteArray thành GUID.Chuyển đổi ByteArray sang UUID java

Trước đây tôi đã chuyển đổi guid của mình thành mảng byte và sau một số giao dịch, tôi cần guid của tôi trở lại từ mảng byte. Làm thế nào để làm điều đó. Mặc dù không liên quan nhưng chuyển đổi từ Guid để byte [] như sau

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

nhưng làm thế nào để chuyển đổi nó trở lại ??

Tôi đã thử phương pháp này, nhưng nó không trở lại cho tôi cùng một giá trị

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

Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

17

Phương pháp nameUUIDFromBytes() chuyển đổi tên thành UUID. Bên trong, nó áp dụng băm và một số ma thuật đen để biến bất kỳ tên nào (tức là một chuỗi) thành UUID hợp lệ.

Bạn phải sử dụng new UUID(long, long); constructor thay vì:

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

Nhưng kể từ khi bạn không cần đối tượng UUID, bạn chỉ có thể làm một bãi chứa hex:

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 để giải thích: _Specially_ cho Hashing và một số ma thuật _black_ :) –

+1

Để cụ thể hơn về 'ma thuật đen' (điều này không thực sự rõ ràng về những gì đang thực sự xảy ra), hãy xem http: // docs. oracle.com/javase/7/docs/api/java/util/UUID.html. Cụ thể, 'UUID công khai (dài nhấtSigBits, dài nhấtSigBits)' có thể xây dựng bất kỳ loại UUID nào bạn muốn. Nó có thể thậm chí có thể làm cho UUID không hợp lệ với các loại khác hơn 1, 2, 3, hoặc 4 - nhưng tôi đã không xác minh điều này. 'nameUUIDFromBytes' sẽ chỉ xây dựng UUID loại 3. –

7

Hãy thử:

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

Vấn đề của bạn là UUID.nameUUIDFromBytes(...) chỉ tạo ra gõ 3 UUIDs, nhưng bạn muốn bất kỳ loại UUID.

+0

Nếu nó là 8 hoặc 16 byte, nó sẽ hoạt động. Điều gì sẽ xảy ra nếu nó có 4 byte. Tôi nghĩ rằng nó sẽ sụp đổ (java.nio.bufferoverflowexception). Làm thế nào chúng ta có thể khắc phục điều này? – mindus

+1

@mindus UUID là [được định nghĩa là có 128 bit (16 byte)] (http://en.wikipedia.org/wiki/Universally_unique_identifier#Definition). Nếu bạn chỉ có 32 bit đầu tiên, không có cách nào để "sửa" điều đó. Bạn có thể muốn thêm xác nhận đầu vào và ném một 'IllegalArgumentException' nếu đầu vào là! = 16 byte mặc dù. – haraldK

1

Hãy thử làm tương tự quá trình ngược lại:

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

Đối với cả hai xây dựng và phân tích byte của bạn [], bạn thực sự cần phải xem xét các byte order.

+0

Hoàn hảo. Làm việc cho tôi – Android

+0

Nếu nó là 8 hoặc 16 byte, nó sẽ hoạt động. Điều gì sẽ xảy ra nếu nó có 4 byte. Tôi nghĩ rằng nó sẽ sụp đổ (java.nio.bufferoverflowexception). Làm thế nào chúng ta có thể khắc phục điều này? – mindus

Các vấn đề liên quan