UUID меняется каждый раз, потому что он уникален!Каждый новый сгенерированный отличается.
Что касается странных символов, то ваше отображение uuid
(а также type
) в StringByReference
является виновником, так как вы не получаете данныев формате, в котором он хранится в исходном формате.
Подпись метода в C (которую вы должны были опубликовать со своим вопросом) отмечает, что тип uuid
равен **char
, Указатель на указатель на строку8-битных значений C.Копаясь в исходном коде, кажется, что они представляют собой цифры 0-9 и AF в строковом представлении, и либо 32 байта (без дефисов), либо 36 байтов (с) плюс нулевой терминатор.(Обратите внимание, что это не всегда очевидно; они могли бы быть сохранены в 16 байтах как полное значение байта, что API должен фактически задокументировать.)
Внутри класса StringByReference
используется метод Pointer.getString()
:
public String getValue() {
return getPointer().getString(0);
}
Метод getString () только со смещением использует кодировку по умолчанию вашей платформы, которая, вероятно, является многобайтовым набором символов.Это может не соответствовать (и, очевидно, в вашем случае) не соответствует 8-битной кодировке UUID.
Вы должны отобразить UUID как PointerByReference
и использовать uuid.getValue().getString(0, "UTF-8")
или uuid.getValue().getString(0, "US-ASCII")
дляполучить строку как 8-битные символы, которые они представляют.
(С другой стороны, вы можете получить байтовый массив и создать из него строку, хотя я не уверен, что вы получите 32- или 36-байтовый результат, так что получайте удовольствие, если вы пойдете по этому путиДля истинного удовольствия вы можете перебирать смещение и читать побайтово до тех пор, пока не получите 0. Но я отвлекся.)
То же самое для поля type
оставлено в качестве упражнения длячитатель.