Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中打包/解包UUID_Ruby_Uuid - Fatal编程技术网

在Ruby中打包/解包UUID

在Ruby中打包/解包UUID,ruby,uuid,Ruby,Uuid,如果我有一个UUID字符串,如下所示: 217aad3b-0b3d-4df0-a9ee-4fc9708f40bd 如何将其打包到字节数组(16字节)中,以便通过HTTP将其作为二进制数据发送 给定字节数组,什么函数可以将其解压为如上所述的字符串?您可以使用它来打包字符串: 首先需要将其转换为16位整数数组: num_arr = "217aad3b-0b3d-4df0-a9ee-4fc9708f40bd".scan(/[0-9a-f]{4}/).map { |x| x.to_i(16) } #

如果我有一个UUID字符串,如下所示:

217aad3b-0b3d-4df0-a9ee-4fc9708f40bd
如何将其打包到字节数组(16字节)中,以便通过HTTP将其作为二进制数据发送

给定字节数组,什么函数可以将其解压为如上所述的字符串?

您可以使用它来打包字符串:

首先需要将其转换为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]
然后打包:

packed = num_arr.pack('n*')
# => "!z\xAD;\v=M\xF0\xA9\xEEO\xC9p\x8F@\xBD"
packed.bytesize
# => 16
packed
是一个字符串,但在Ruby中,字节数组表示为字符串。

您可以使用以下方法打包字符串:

首先需要将其转换为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]
然后打包:

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

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

我认为这是不可能的:在Ruby中,字符是一个字节。(“放‘a’。字节大小”)。UUID有36个字符,因此它永远无法放入16字节数组中。Ruby现在默认为UTF-8,因此字符在必要时是多字节的:
“é”。bytesize#=>2
。但这可能对操作没有帮助。UUID是128位的值,而不是字符串。用十六进制表示UUID的字符串可能会占用36个字节,但其中大部分是“浪费的空间”。128位/8位=16个字节。我认为这是不可能的:在ruby中,字符是一个字节一个字节。(“放‘a’。字节大小”)。UUID有36个字符,因此它永远无法放入16字节数组中。Ruby现在默认为UTF-8,因此字符在必要时是多字节的:
“é”。bytesize#=>2
。但这可能对操作没有帮助。UUID是128位的值,而不是字符串。以十六进制表示的UUID字符串可能会占用36个字节,但这些字节中的大多数是“浪费的空间”。128位/8位=16个字节。请注意,上述虽然是GUID的字节表示,但不是GUID的正确字节表示。如果使用C#获取GUID的字节表示形式,使用
GUID.Parse(“217aad3b-0b3d-4df0-a9ee-4fc9708f40bd”).ToByteArray()。选择(b=>b.ToString(“X”)
您会注意到字节是3BAD7A213DBF04A9EE4FC9708F40BD-在Ruby中,这将是
“;\xADz!=\v\xF0M\xA9\xEEO\xC9p\x8F\xBD”
-请注意,如果您正在寻找一个有效的字节字符串,以便在对Win32 API进行API调用时使用,则上述答案错误地打包了字节结束符。请注意,上述答案虽然是GUID的字节表示形式,但不是GUID的正确字节表示形式。如果使用C#获取GUID的字节表示形式,使用
GUID.Parse(“217aad3b-0b3d-4df0-a9ee-4fc9708f40bd”).ToByteArray()。选择(b=>b.ToString(“X”)
您会注意到字节是3BAD7A213DBF04A9EE4FC9708F40BD-在Ruby中,这将是
“;\xADz!=\v\xF0M\xA9\xEEO\xC9p\x8F\xBD”
-请注意,如果您正在寻找一个有效的字节字符串,以便在对Win32 API进行API调用时使用,则上述答案错误地打包了字节结束符。