在Ruby中打包/解压缩UUID

bir*_*rda 1 ruby uuid

如果我有一个如下的UUID字符串:

217aad3b-0b3d-4df0-a9ee-4fc9708f40bd
Run Code Online (Sandbox Code Playgroud)

如何将其打包成一个字节数组(16个字节),以便我可以通过HTTP将其作为二进制数据发送?

给定字节数组,将它解压缩为如上所示的字符串的函数是什么?

Uri*_*ssi 10

您可以Array.pack用来打包字符串:

首先,您需要将其转换为16位整数数组:

num_arr = "217aad3b-0b3d-4df0-a9ee-4fc9708f40bd".scan(/[0-9a-f]{4}/).map { |x| x.to_i(16) }
# => [8570, 44347, 2877, 19952, 43502, 20425, 28815, 16573]
Run Code Online (Sandbox Code Playgroud)

然后收拾它:

packed = num_arr.pack('n*')
# => "!z\xAD;\v=M\xF0\xA9\xEEO\xC9p\x8F@\xBD"
packed.bytesize
# => 16
Run Code Online (Sandbox Code Playgroud)

packed 是一个字符串,但在Ruby中,字节数组表示为字符串.

  • 注意,上面的GUID的字节表示虽然不是GUID的正确字节表示.如果使用C#来获取GUID的字节表示,使用`Guid.Parse("217aad3b-0b3d-4df0-a9ee-4fc9708f40bd").ToByteArray().选择(b => b.ToString("X"))`你会注意到这些字节是这样的.在Ruby中,这将是``;\xADz!=\v\xF0M\xA9\xEEO\xC9p\x8F @\xBD"` - 请注意,如果您正在寻找在针对Win32 API进行API调用时使用的有效字节字符串,则上述答案会错误地打包字节字节序. (2认同)