如何增量读取二进制文件

问题描述 投票:1回答:2

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

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

是否有一种逐字节增量读取二进制文件的方法?我所看到的只是读/二进制文件,它似乎一次吞噬整个文件(或文件的一部分)。

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

(是的,我可以提供一些帮助该职位的助手,并使用读取/部分/查找。)

如果可能的话,我想打电话给低级操作系统,以进行读取/查找-需要学习的新知识。

这是在macOS上,但是可移植的解决方案会很棒。

感谢!

PS:“打开/读取%abc”给出错误“ ***脚本错误:打开的port参数不允许使用文件!”,即使帮助消息中指出port参数是“ port [port!file !! url!block!]“

rebol red
2个回答
0
投票

Rebol为此具有ports,已计划以红色发布0.7.0。因此,当前的I / O是非常基本的并且仅用于缓冲区,并且open是初步的存根。

如果可能的话,我想打电话给低级操作系统,以进行读取/查找-需要学习的新知识。

您可以利用RebolRed/System FFI作为学习练习。


0
投票

这是您在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将返回下一个字节值(integer!

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

很快它将在红色上可用。

© www.soinside.com 2019 - 2024. All rights reserved.