在Ruby中读取二进制16位带符号(big-endian)整数

时间:2011-02-03 13:56:25

标签: ruby

我试图从一个文件中读取数字以big-endian格式存储为16位有符号整数。

我使用unpack读取数字,但是big-endian格式的16位有符号整数没有参数,仅用于无符号整数。以下是我到目前为止的情况:

number = f.read(2).unpack('s')[0]

有没有办法将上面的数字解释为有符号整数或另一种实现我想要的方式?

4 个答案:

答案 0 :(得分:7)

我不知道是否可以使用String#unpack直接获取您想要的值,但是要将16位无符号转换为已签名,我会写classical method

>> value = 65534
>> (value & ~(1 << 15)) - (value & (1 << 15))
=> -2

如果你觉得好看:

class Integer
  def to_signed(bits)
    mask = (1 << (bits - 1))
    (self & ~mask) - (self & mask)
  end
end

p 1001.to_signed(16) # => 1001
p 65534.to_signed(16) # => -2

答案 1 :(得分:3)

使用BinData并且不需要苦苦挣扎。

BinData::Int16be.read(io)

答案 2 :(得分:1)

找到一个解决方案,通过读取两个8位无符号整数并将它们转换为16位大端整数

bytes = f.read(2).unpack('CC')  
elevation = bytes[0] << 8 | bytes[1]

答案 3 :(得分:0)

显然,从Ruby 1.9.3开始,你实际上可以使用endiannes为s添加后缀,如下所示: io.read(2).unpack('s>')