【发布时间】:2014-05-23 08:06:49
【问题描述】:
从TCPSocket 读取了 4 个字节(实际上是 socket 返回一个字符串,然后我调用.bytes 来获取一个数组)。现在需要将它们转换为 int32 大端。
或者可能是 TCPSocket 有一些方法可以立即读取 int32?
【问题讨论】:
标签: ruby arrays type-conversion tcpsocket int32
从TCPSocket 读取了 4 个字节(实际上是 socket 返回一个字符串,然后我调用.bytes 来获取一个数组)。现在需要将它们转换为 int32 大端。
或者可能是 TCPSocket 有一些方法可以立即读取 int32?
【问题讨论】:
标签: ruby arrays type-conversion tcpsocket int32
您可以使用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*')
【讨论】:
"\x00\x00\x00\xFF".unpack("N*")" => [255]。 Array#pack 似乎仍然会产生二进制字符串而不是数字?
unpack 的引用,但所有示例都使用pack,它产生一个字符串而不是整数。我对自己编辑答案有点谨慎,因为我可能会错过其中的一些隐藏意义。
String#unpack 的工作示例,我将他的旧答案放在它下面以供参考,它将字节数组转换为二进制字符串。