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为此具有ports,已计划以红色发布0.7.0。因此,当前的I / O是非常基本的并且仅用于缓冲区,并且open
是初步的存根。
如果可能的话,我想打电话给低级操作系统,以进行读取/查找-需要学习的新知识。
您可以利用Rebol或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 file
或pick file 1
将返回下一个字节值(integer!
)
这甚至适用于文本文件:open/lines/direct
,在这种情况下,copy/part file 20
将返回20行,或者您可以使用pick file 1
或first file
获得下一行。
很快它将在红色上可用。