Как сделать инкрементное чтение двоичных файлов - PullRequest
2 голосов
/ 01 октября 2019

TL; DR: можно ли выполнить инкрементное чтение двоичных файлов с помощью Red или Rebol?

Я хотел бы использовать Red для обработки некоторых больших (от 13 МБ до 2 ГБ) структурированных двоичных файлов (файлы синтезатора Kurzweil),Я использовал другие языки (C, Go, Tcl, Ruby, Dart), чтобы просмотреть эти файлы, и теперь я хотел бы сделать то же самое с Red или Rebol.

Есть ли способ постепенночитать двоичные файлы, побайтово? Все, что я вижу, - это чтение / двоичный файл, который, кажется, выплескивает весь файл сразу (или часть файла).

Мне тоже нужно немного перепрыгнуть (либо заглянуть в следующий байтили перейдите к концу раздела или пропустите строки переменной длины до начала данных.

(Да, я мог бы сделать несколько помощников, которые отслеживали позицию и использовали чтение / часть / поиск.)

Я хотел бы позвонить в операционную систему низкого уровня для чтения / поиска, если это возможно - что-то новое для изучения.

Это на макросах, но портативное решение было бы здорово.

Спасибо!

PS: «open / read% abc» выдает ошибку «*** Ошибка скрипта: open не допускает файл! Для аргумента порта», даже если в справочном сообщении говорится, что аргумент порта - «порт [port! file! url! block!] "

Ответы [ 2 ]

4 голосов
/ 02 октября 2019

Вот как вы бы это сделали в Rebol:

>> file: open/direct/binary %file.dat
>> until [none? probe copy/part file 20]
>> close file
#{732F7072696E74657253657474696E6773312E62}
#{696E504B01022D00140006000800000021006149}
#{0910890100001103000010000000000000000000}
...
#{000000006A290000646F6350726F70732F617070}
#{2E786D6C504B0506000000000D000D0068030000}
#{292C00000000}
none

first file или pick file 1 вернет значение следующего байта (integer!)

Это работает даже стекстовые файлы: open/lines/direct, в этом случае copy/part file 20 вернет 20 строк, или вы можете использовать pick file 1 или first file, чтобы получить следующую строку.

Скоро это будет доступно и для Red.

4 голосов
/ 01 октября 2019

У Rebol есть порты для этого, которые запланированы на выпуск 0.7.0 в красном. Итак, текущий ввод / вывод очень простой и только для буфера, а open - предварительная заглушка.

Я хотел бы сделать вызов низкоуровневой ОС для чтения / поиска, если этовозможно - что-то новое для изучения.

Вы можете использовать Rebol или Red / System FFI в качестве учебного упражнения.

...