2015-05-13 3 views
0

У меня есть две длинные точки, представляющие наибольшие и наименее значащие байты UUID соответственно. Как я могу использовать Ruby для преобразования этих двух длин в 32-символьное шестнадцатеричное представление?Преобразование двух длин в шестнадцатеричную строку

ответ

2

Попробуйте использовать % string format operator как "%016x" (шестнадцать ноль проложенных шестнадцатеричных цифр):

a = 0xCAFEBABECAFEBABE # => 14627333968358193854 
b = 0xDEADBEEFDEADBEEF # => 16045690984833335023 
'%016x%016x' % [a, b] # => "cafebabecafebabedeadbeefdeadbeef" 

Есть много способов, чтобы вставить тир на нужном месте, если вы хотите, чтобы получить правильно отформатированный UUID строки; вот первое, что приходит на ум:

def longs_to_uuid(a, b) 
    s = '%016x%016x' % [a, b] 
    s.scan(/(.{8})(.{4})(.{4})(.{4})(.{12})/).first.join('-') 
end 

longs_to_uuid(1,2) # => "00000000-0000-0001-0000-000000000002" 

Не забудьте рассмотреть, если это порядка байтов это беспокойство ...

+0

Спасибо за ответ. Я думаю, что endianness имеет какое-то отношение к нему, как к некоторым входам (например, 1087192506523562918), я возвращаю только 31 символ. – Blumer

+0

@Blumer: проверьте обновление этого ответа, перезагрузив страницу, я включил нужное дополнение. – maerics

+0

Yup, я думаю, что сделал это. Спасибо за вашу помощь! – Blumer

Смежные вопросы