Ruby - 如何将消息长度表示为2个二进制字节

5
我正在使用Ruby与要求在发送消息之前格式化“头部”的网络端点进行通信。
头部中的第一个字段必须是消息长度,定义为以网络字节序表示的2个二进制字节的消息长度。
例如,我的消息长度为1024。我该如何将1024表示为二进制两个字节?
2个回答

5
在Ruby(Perl和Python等)中进行字节操作的标准工具是packunpack。 Ruby的packArray中。 如果你有一个长度应该为两个字节并且以网络字节序表示的任务,那么你需要使用n格式说明符:

n | Integer | 16位无符号网络字节序(大端序)

因此,如果长度为length,则可以这样获取两个字节:

two_bytes = [ length ].pack('n')

如果需要相反的操作,请查看String#unpack

length = two_bytes.unpack('n').first

5

请查看Array#pack

[1024].pack("n")

这将数字打包为网络顺序的字节序列\x04\x00
其工作原理是每个字节都是8位二进制位。1024的二进制是10000000000。如果我们将其分成每个8个位(每个字节8位),我们得到:00000100 00000000
一个字节可以表示(2个状态)^(8个位置)= 256个唯一值。然而,由于我们没有256个ASCII可打印字符,因此我们用十六进制对表示字节,因为十六进制数字可以表示16个不同的值,而16 * 16 = 256。因此,我们可以将第一个字节00000100拆分为两个十六进制四位数,如0000 0100。将二进制转换为十六进制得到0x04。第二个字节很简单,因为0000 00000x00。这给出了我们的两个字节字符串的十六进制表示形式。
值得注意的是,由于您受到2字节(16位)标头的限制,因此您仅限于最大值为11111111 11111111或2^16-1=65535字节。任何大于该大小的消息都无法准确地用两个字节表示其长度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接