2016-06-06 3 views
2

В настоящее время я пытаюсь читать двоичный файл в кусках, и мое решение до сих пор было так:Чтение двоичных байт за байтом в Рубине

first_portion = File.binread(replay_file, 20) 
second_portion = File.binread(replay_file, 24, 20) 

Если первое число этого количества байт для чтения а второй - смещение.

Я знаю, что это плохо, потому что File.binread закрывает файл каждый раз после возвращения. Как я могу открыть файл один раз, сделать то, что я есть с, а затем закрыть его, когда я закончил (но все еще использую binread).

Кроме того, еще один маленький вопрос. Я смотрел на несколько примеров этого в питона и видел это:

UINT32 = 'uintle:32' 

length = binary_file.read(UINT32) 
content = binary_file.read(8 * length) 

Что именно это делают (как это работает), и что бы это выглядеть в Ruby?

ответ

3

Вы можете открыть файл и прочитать байты в кусках с #read и #seek:

File.open(replay_file) do |file| 
    first_portion = file.read(20) 
    file.seek(24, IO::SEEK_END) 
    second_portion = file.read(20) 
end 

Файл автоматически закрывается в end.

О втором вопросе, я не эксперт в Python, а кто-то поправьте меня, если я ошибаюсь, но это было бы это в Ruby:

length = binary_file.read(4).unpack('N').first 
# 32 bits = 4 bytes 
# i.e., read 4 bytes, convert to a 32 bit integer, 
# fetch the first element of the array (unpack always returns an array) 

content = binary_file.read(8 * length) 
# pretty much verbatim 

Вы можете проверить больше вариантов здесь: String#unpack

+0

Спасибо, вы были невероятно полезны. – Fianite

+0

Один быстрый вопрос: как изменилась бы первая строка во втором ответе, если бы я имел дело с UINT64 или FLOAT32? UINT64 будет 8 байтов, FLOAT32 будет 4 байта, это все, что изменится? Кроме того, почему в первую очередь необходимо? – Fianite

+0

@Fianite 'unpack' имеет еще много вариантов. Прочитайте это. – tadman

Смежные вопросы