Как я могу преобразовать GUID в байтовый массив в Ruby? - PullRequest
0 голосов
/ 20 февраля 2019

Для экономии трафика данных мы хотим отправлять наши GUID в виде массива байтов, а не в виде строки (с использованием буферов протокола Google).

Как преобразовать строковое представление GUIDв Ruby к массиву байтов:

Пример:

Guid: 35918bc9-196d-40ea-9779-889d79b753f0
=> Result: C9 8B 91 35 6D 19 EA 40 97 79 88 9D 79 B7 53 F0

В .NET это, по-видимому, реализовано изначально: http://msdn.microsoft.com/en-us/library/system.guid.tobytearray%28v=vs.110%29.aspx

1 Ответ

0 голосов
/ 20 февраля 2019

Ваш пример GUID в формате Microsoft.Из Википедии :

Другие системы, в частности, маршаллинг UUID от Microsoft в своих библиотеках COM / OLE, используют формат со смешанным порядком байтов, в котором первые три компонента UUID мало-endian, а последние два - big-endian.

Итак, чтобы получить такой результат, нам нужно немного переместить биты.В частности, мы должны изменить порядок байтов первых трех компонентов.Давайте начнем с разбивания строки GUID на части:

guid = '35918bc9-196d-40ea-9779-889d79b753f0'
parts = guid.split('-')
#=> ["35918bc9", "196d", "40ea", "9779", "889d79b753f0"]

Мы можем преобразовать эти шестнадцатеричные строки в двоичные с помощью:

mixed_endian = parts.pack('H* H* H* H* H*')
#=> "5\x91\x8B\xC9\x19m@\xEA\x97y\x88\x9Dy\xB7S\xF0"

Далее давайте поменяем первые три части:

big_endian = mixed_endian.unpack('L< S< S< A*').pack('L> S> S> A*')
#=> "\xC9\x8B\x915m\x19\xEA@\x97y\x88\x9Dy\xB7S\xF0"
  • L обозначает 32-разрядное целое число без знака (1-й компонент)
  • S обозначает 16-разрядное целое число без знака (2-й и 3-й компонент)
  • < и > обозначают little-endian и big-endian соответственно
  • A* обрабатывает оставшиеся байты как произвольную двоичную строку (нам не нужно преобразовывать их)

Если вы предпочитаете массив байтов вместо двоичной строки, вы просто используете:

big_endian.bytes
#=> [201, 139, 145, 53, 109, 25, 234, 64, 151, 121, 136, 157, 121, 183, 83, 240]

PS: если ваш фактический GUID не зависит от Microsoft, вы можете пропуститьобменная часть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...