Чтение двоичного 16-битного целого числа с прямым порядком байтов в Ruby - PullRequest
3 голосов
/ 03 февраля 2011

Я попытался прочитать файл, в котором числа хранятся в виде 16-разрядных целых чисел со знаком в формате с прямым порядком байтов.

Я использовал unpack для чтения числа, но для 16-разрядного целого числа со знаком в формате с прямым порядком байтов нет параметра, только для целого числа без знака. Вот то, что я имею до сих пор:

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

Есть ли способ интерпретировать приведенное выше число как целое число со знаком или другой способ достичь того, чего я хочу?

Ответы [ 4 ]

7 голосов
/ 03 февраля 2011

Я не знаю, возможно ли использовать String#unpack для непосредственного получения нужного значения, но для преобразования 16-битного без знака в знаковое я бы написал классический метод :

>> 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
3 голосов
/ 04 февраля 2011

Используйте BinData , и нет необходимости в битовой перестановке.

BinData::Int16be.read(io)
1 голос
/ 03 февраля 2011

Нашел решение, которое работает путем чтения двух 8-битных целых чисел без знака и преобразования их в 16-битное целое число с прямым порядком байтов

bytes = f.read(2).unpack('CC')  
elevation = bytes[0] << 8 | bytes[1]
0 голосов
/ 08 января 2018

Очевидно, что начиная с Ruby 1.9.3 вы можете на самом деле суффикс s с помощью endiannes, например, так: io.read(2).unpack('s>')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...