Ruby - чтение байтов из файла, преобразование в целое число - PullRequest
3 голосов
/ 25 августа 2009

Я пытаюсь прочитать беззнаковые целые числа из файла (хранящегося как последовательный байт) и преобразовать их в целые числа. Я пробовал это:

file = File.new(filename,"r")
num = file.read(2).unpack("S") #read an unsigned short
puts num #value  will be less than expected

Что я здесь не так делаю?

Ответы [ 6 ]

5 голосов
/ 25 августа 2009

Вы не читаете достаточно байтов. Как вы говорите в комментарии к ответу Тэдмана, вы получаете 202 вместо 3405691582

Обратите внимание, что первые 2 байта 0xCAFEBABE равны 0xCA = 202

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

1012 * попробовать *

num = file.read(8).unpack("L_")

Подчеркивание предполагает, что нативный long будет 8 байтов, что определенно не гарантируется.

4 голосов
/ 05 декабря 2010

Как насчет поиска в кирке? (Рубин 1.9, стр. 44)

File.open("testfile") 
do |file|
    file.each_byte {|ch| print "#{ch.chr}:#{ch} " }
end

каждый_байт перебирает файл за байтом.

2 голосов
/ 25 августа 2009

В Ruby есть пара библиотек, которые помогают анализировать двоичные данные, позволяя вам объявить формат данных в простом декларативном DSL высокого уровня, а затем выяснить всю упаковку, распаковку, сдвоение, сдвиг и порядок -конверсии сами по себе.

Я никогда не использовал один из них, но вот два примера. (Есть еще, но я их не знаю):

1 голос
/ 25 августа 2009

Хорошо, я получил это на работу:

num = file.read(8).unpack("N")

Спасибо за вашу помощь.

0 голосов
/ 25 августа 2009

При работе с двоичными данными вы должны быть уверены, что открываете файл в двоичном режиме, если вы работаете в Windows. Это касается как чтения, так и письма.

open(filename, "rb") do |file|
  num = file.read(2).unpack("S")
  puts num
end

Могут также быть проблемы с кодировкой «endian» в зависимости от исходной платформы. Например, компьютеры на базе PowerPC, которые включают старые системы Mac, серверы IBM Power, кластеры PS3 или серверы Sun Sparc.

Можете ли вы опубликовать пример того, как это "меньше"? Обычно в данных есть очевидная закономерность.

Например, если вы хотите 0x1234, но получаете 0x3412, это проблема с порядком байтов.

0 голосов
/ 25 августа 2009

В каком формате хранятся числа в файле? Это в гексе? Ваш код выглядит правильно для меня.

...