Преобразование ByteArray в UUID java

Вопрос: Как преобразовать ByteArray в GUID.

Раньше я преобразовал свой указатель в массив байтов, и после некоторой транзакции мне нужен мой указатель назад из массива байтов. Как это сделать. Хотя нерелевантность, но преобразование из Guid в байт [] ниже

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

но как его преобразовать обратно?

Я пробовал этот метод, но не возвращал мне то же значение

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

Любая помощь будет оценена.

Ответ 1

Метод nameUUIDFromBytes() преобразует имя в UUID. Внутри он применял хеширование и некоторую черную магию, чтобы превратить любое имя (т.е. Строку) в действительный UUID.

Вместо этого вы должны использовать конструктор new UUID(long, long);:

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

Но так как вам не нужен объект UUID, вы можете просто сделать шестнадцатеричный дамп:

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

Try:

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

Ваша проблема в том, что UUID.nameUUIDFromBytes(...) создает только UUID типа 3, но вам нужен любой тип UUID.

Ответ 3

Попробуйте сделать тот же процесс в обратном порядке:

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

Для построения и анализа вашего байта [] вам действительно нужно рассмотреть порядок байтов.

Ответ 4

В UuidUtil есть метод из uuid-creator, который это делает.

UUID uuid = UuidUtil.fromBytesToUuid(bytes);

Другой метод делает обратное.

byte[] bytes = UuidUtil.fromUuidToBytes(uuid);

https://github.com/f4b6a3/uuid-creator