Эмулировать кодировку UUID в Base64 - PullRequest
0 голосов
/ 30 июня 2018

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

Код C #, который мне дали:

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, и приложение, очевидно, использует указанный выше код c # для генерации значения ShortGuid для "NQUZ-gBrUkSKsTGccwgrYA".

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

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

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Вам нужно использовать bytes_le, чтобы получить порядковый номер для совпадения Microsoft :

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

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

0 голосов
/ 30 июня 2018

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

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

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

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

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

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

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

...