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

sli*_*ver 3 ruby

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

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

number = f.read(2).unpack('s')[0]
Run Code Online (Sandbox Code Playgroud)

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

tok*_*and 7

我不知道是否可以使用String#unpack直接获得你想要的值,但是要将16bit-unsigned转换为signed,我会编写经典方法:

>> value = 65534
>> (value & ~(1 << 15)) - (value & (1 << 15))
=> -2
Run Code Online (Sandbox Code Playgroud)

如果你觉得有点喜欢:

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
Run Code Online (Sandbox Code Playgroud)