如何增量读取二进制文件

How to do an incremental read of binary files

TL;DR:我可以使用 Red 或 Rebol 增量读取二进制文件吗?

我想用 Red 处理一些大的(13MB 到 2GB)结构化二进制文件(Kurzweil 合成器文件)。我曾使用其他语言(C、Go、Tcl、Ruby、Dart)浏览这些文件,现在我想对 Red 或 Rebol 做同样的事情。

有没有办法逐字节地增量读取二进制文件?我所看到的是 read/binary 似乎一次吞噬了整个文件(或文件的一部分)。

我也需要跳转一点(查看下一个字节,或者跳到一个部分的末尾,或者跳过可变长度字符串到数据的开头)。

(是的,我可以制作一些跟踪位置并使用 read/part/seek 的助手。)

如果可能的话,我想打电话给低层 OS read/seek - 要学点新东西。

这是在 macOS 上,但便携式解决方案会很棒。

谢谢!

PS: "open/read %abc" 给出错误“*** 脚本错误:打开不允许文件!对于它的端口参数”,即使帮助消息说端口参数是 "port [port! file! url! block!]"

Rebol 有 ports for that, which are planned for 0.7.0 红色版本。因此,当前 I/O 是非常基本的且仅用于缓冲区,而 open 是初步存根。

I would like to make a call to the low level OS read/seek if that is possible - something new to learn.

您可以利用 Rebol or Red/System FFI 作为学习练习。

这是在 Rebol 中的做法:

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

first filepick file 1 将 return 下一个字节值 (integer!)

这甚至适用于文本文件:open/lines/direct,在这种情况下 copy/part file 20 将 return 20 行,或者您可以使用 pick file 1first file获取下一行。

很快这也将在 Red 上可用。