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

use*_*597 5 ruby sockets binary byte

我正在使用Ruby,并且我正在与网络端点进行通信,该端点需要在发送消息之前格式化"标头".

标头中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2个二进制字节消息长度.

例如,我的消息长度为1024.如何将1024表示为二进制两字节?

mu *_*ort 5

Ruby(以及Perl和Python和......)中用于字节争论的标准工具是packunpack.Ruby pack是在Array.您的长度应该是两个字节长并且以网络字节顺序,这听起来像n格式说明符的作业:

n | 整数| 16位无符号,网络(大端)字节顺序

因此,如果长度在length,你将获得两个字节:

two_bytes = [ length ].pack('n')
Run Code Online (Sandbox Code Playgroud)

如果你需要做相反的事情,请看看String#unpack:

length = two_bytes.unpack('n').first
Run Code Online (Sandbox Code Playgroud)


Chr*_*ald 5

请参阅数组#pack

[1024].pack("n")
Run Code Online (Sandbox Code Playgroud)

这会将数字打包为网络顺序字节序列\x04\x00

其工作原理是每个字节都是 8 个二进制位。二进制的 1024 是10000000000. 如果我们将其分解为 8 个八位组(每字节 8 位),我们会得到:00000100 00000000

一个字节可以表示(2 个状态)^(8 个位置)= 256 个唯一值。然而,由于我们没有 256 个可打印的 ascii 字符,我们在视觉上将字节表示为十六进制对,因为一个十六进制数字可以表示 16 个不同的值,即 16 * 16 = 256。因此,我们可以取出第一个字节,00000100并将其分解分成两个十六进制四元组作为0000 0100. 将二进制转换为十六进制可以得到0x04. 第二个字节很简单,就像0000 0000一样0x00。这为我们提供了两字节字符串的十六进制表示形式。

值得注意的是,由于您被限制为 2 字节(16 位)标头,因此您的最大值被限制为11111111 11111111, 或 2^16 - 1 =65535字节。任何大于该值的消息都无法准确地用两个字节表示其长度。