Ruby:int32的4字节数组

时间:2014-05-23 08:06:50

标签: ruby arrays type-conversion tcpsocket int32

TCPSocket读取4个字节(实际上socket返回一个字符串,然后我调用.bytes来获取一个数组)。现在需要将它们转换为int32 big endian。

或者可能TCPSocket有一些方法可以立即读取int32吗?

1 个答案:

答案 0 :(得分:6)

您可以使用String#unpack。参数表示转换的类型。下面使用"N"表示“32位无符号,网络(大端)字节顺序”。请参阅所有选项的链接。

"\x00\x00\x00\x01".unpack("N")
# => [1]

"\x00\x00\x00\xFF".unpack("N")
# => [255]

请注意,结果为Array,因此请[0].first获取Fixnum


使用Array#pack的原始答案,将字节数组转换为二进制字符串:

您可以使用Array#pack

# unsigned 32-bit integer (big endian)
bytes.pack('L>*')

# signed 32-bit integer (big endian)
bytes.pack('l>*')

也许你会发现N指令很有用,它代表“网络字节顺序”

# 32-bit unsigned, network (big-endian) byte order
bytes.pack('N*')