【问题标题】:Ruby: 4-bytes array to int32Ruby:4 字节数组到 int32
【发布时间】:2014-05-23 08:06:49
【问题描述】:

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

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

【问题讨论】:

    标签: ruby arrays type-conversion tcpsocket int32


    【解决方案1】:

    您可以使用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*')
    

    【讨论】:

    • 既然他是从 TCPSocket 的 String 开始的,那String#unpack 不是更合适一点吗?例如"\x00\x00\x00\xFF".unpack("N*")" => [255]。 Array#pack 似乎仍然会产生二进制字符串而不是数字?
    • @p11y: 不应该是 str.unpack 而不是 str.pack 吗?
    • @Paul 是的,您可能想使用它,请参阅我之前的评论。
    • @Daniël Knippers:我只是不完全理解答案。开头有对unpack 的引用,但所有示例都使用pack,它产生一个字符串而不是整数。我对自己编辑答案有点谨慎,因为我可能会错过其中的一些隐藏意义。
    • @Paul 我编辑了答案以包含String#unpack 的工作示例,我将他的旧答案放在它下面以供参考,它将字节数组转换为二进制字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多