Эмулировать кодировку UUID в Base64

1

Я пытаюсь подражать тому, как приложение С# преобразует UUID в значение Base64. По какой-то причине я могу получить часть строки в соответствии с ожидаемым значением, но не всей строкой.

Код С# мне дал:

public static string ToShortGuid(this Guid newGuid) {
string modifiedBase64 = Convert.ToBase64String(newGuid.ToByteArray())
.Replace('+', '-').Replace('/', '_') // avoid invalid URL characters
.Substring(0, 22);
return modifiedBase64;
}

Что я пытался в Python 3.6:

import uuid
import base64

encode_str = = base64.urlsafe_b64encode(uuid.UUID("fa190535-6b00-4452-8ab1-319c73082b60").bytes)
print(encode_str)

"fa190535-6b00-4452-8ab1-319c73082b60" является известным UUID, и приложение, по-видимому, использует вышеуказанный код С# для генерации значения "ShortGuid" "NQUZ-gBrUkSKsTGccwgrYA".

Когда я обрабатываю один и тот же UUID через мой код Python, я получаю: "-hkFNWsARFKKsTGccwgrYA =="

Из обеих этих выходных строк эта часть соответствует: "KsTGccwgrYA", а остальное - нет.

Теги:
uuid

2 ответа

4
Лучший ответ

Вам нужно использовать bytes_le чтобы получить соответствие с Microsoft:

base64.urlsafe_b64encode(uuid.UUID("fa190535-6b00-4452-8ab1-319c73082b60").bytes_le)

Это дает b'NQUZ-gBrUkSKsTGccwgrYA=='.

  • 0
    Фантастика, спасибо, это дает мне результат, который я искал!
5

NQUZ-gBrUkSKsTGccwgrYA соответствует байтовой последовательности 350519fa006b52448ab1319c73082b60.

Если добавить - в соответствующих местах, мы получим:

 350519fa-006b-5244-8ab1-319c73082b60
#   \/     \/   \/
#   /\     /\   /\
 fa190535-6b00-4452-8ab1-319c73082b60

По сравнению с известным UUID, с которого вы начали, байты одинаковы, но порядок в первых трех подгруппах отменен.

Чтобы подражать тому, что делает.NET, вам нужно использовать UUID.bytes_le:

UUID как 16-байтовая строка (с time_low, time_mid и time_hi_version в порядке порядка байтов).

См. Также Почему Guid.ToByteArray() упорядочивает байты так, как он делает?

  • 1
    На самом деле! Этот обмен байтов задокументирован Microsoft по адресу msdn.microsoft.com/en-us/library/… - "Обратите внимание, что порядок байтов в возвращенном байтовом массиве отличается от строкового представления значения Guid. Порядок начала четырехбайтовая группа и следующие две двухбайтовые группы меняются местами, тогда как порядок последней двухбайтовой группы и закрывающей шестибайтовой группы одинаков ».
  • 0
    Интересно, как я могу исправить это в Python? (Мне нужно сделать это в обоих направлениях - от UUID до преобразованного значения, от преобразованного значения обратно до UUID)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню