Ваш пример 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, вы можете пропуститьобменная часть.