我正在使用Ruby与要求在发送消息之前格式化“头部”的网络端点进行通信。
头部中的第一个字段必须是消息长度,定义为以网络字节序表示的2个二进制字节的消息长度。
例如,我的消息长度为1024。我该如何将1024表示为二进制两个字节?
头部中的第一个字段必须是消息长度,定义为以网络字节序表示的2个二进制字节的消息长度。
例如,我的消息长度为1024。我该如何将1024表示为二进制两个字节?
pack
和unpack
。 Ruby的pack
在Array中
。 如果你有一个长度应该为两个字节并且以网络字节序表示的任务,那么你需要使用n
格式说明符:
n | Integer | 16位无符号网络字节序(大端序)
因此,如果长度为length
,则可以这样获取两个字节:
two_bytes = [ length ].pack('n')
如果需要相反的操作,请查看String#unpack
:
length = two_bytes.unpack('n').first
请查看Array#pack。
[1024].pack("n")
\x04\x00
。10000000000
。如果我们将其分成每个8个位(每个字节8位),我们得到:00000100 00000000
。00000100
拆分为两个十六进制四位数,如0000 0100
。将二进制转换为十六进制得到0x04
。第二个字节很简单,因为0000 0000
是0x00
。这给出了我们的两个字节字符串的十六进制表示形式。11111111 11111111
或2^16-1=65535
字节。任何大于该大小的消息都无法准确地用两个字节表示其长度。