Преобразование 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