Ruby(以及Perl和Python和......)中用于字节争论的标准工具是pack和unpack.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)
请参阅数组#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字节。任何大于该值的消息都无法准确地用两个字节表示其长度。