ori*_*ion 15 scripting binary files
这个问题之前问过我几次,现在是为了 回答在/sf/ask/69540411/ 中给出的Bash Answers 中的标准输入中循环二进制数据块的问题 -as-perl-is-to-text也不令人满意。
我正在寻找一种专门用于处理二进制文件 I/O 的脚本环境。我知道我可以使用一种成熟的编程语言(c/Python/...),但它们有巨大的初始化和编码开销(c 中的分配和 fread/fwrite,Python 中的位串......)更不用说它们不太适合编写脚本(从中调用其他应用程序)。Perl 的unpack
功能、面向字符串的操作和愚蠢的语法也好不到哪里去。
类似于od
,但作为一种语言。
我的期望:
read var
用int32 var
, float var
等)。我想像检查 ASCII 文件一样轻松和深入地处理原始数据(摄影、科学数据、未知和记录不佳的格式)。我现在正在使用c
,但它不是临时脚本的最佳选择,并且不能进行交互。
有人知道这样的工具吗?请不要使用可点击的 GUI 软件,它需要通过 ssh、其他脚本等工作。“不存在”是一个可以接受但令人沮丧的答案。
多年来我也遇到了和你完全相同的问题。
对于简单的非交互式用途,我喜欢使用二进制块编辑器BBE。BBE 之于二进制就像 SED 之于文本,包括其古老的语法和简单性,但是,它缺少很多我经常需要的功能,因此我必须将其与其他工具结合起来。所以,BBE只是一个部分解决方案。另请注意,BBE 多年来没有任何更新或改进。
当然,可以在使用基于文本的工具编辑数据xxd
之前和xxd -r
之后使用,但是当相关数据很大并且需要随机访问时(例如在处理块设备时),这将不起作用。
(注意:对于 Windows,至少有昂贵的专有 WinHex 脚本语言,但这不会让我们有任何进展。)
对于更复杂的二进制编辑,我通常也会使用 Python,尽管它有时对于大文件来说太慢,这是它的主要缺点。我希望Pyston(Python 采用 LLVM 编译为优化的机器代码)有一天能够成熟到可以使用,或者更好的是,有人会设计和实现一种免费的紧凑、快速和多功能的二进制处理脚本语言,据我所知,这种语言并不存在U*IX 还像系统。
更新
我也碰巧使用了自制软件,即开源 Intel x86 汇编器平面汇编器(简称 fasm),它已不仅仅是一个汇编器了。
它有一个强大的、基于文本块的宏预处理器(本身是一种图灵完备语言),其语法采用 borland Turbo 汇编器宏语言的传统,但更先进。
此外,它还有一种数据操作语言,允许二进制包含任意文件,在“编译时”对其进行各种二进制和算术操作(仅限整数)并将结果写入输出文件。这种数据操作语言具有控制结构并且也是图灵完备的。
它比用 C 甚至 Python 编写进行一些二进制操作的程序要容易得多。另外,它的加载速度快得惊人,因为它是一个小型可执行文件,几乎没有外部依赖性(有 2 个版本:要么只需要 libc,要么可以直接在 Linux 内核 ABI 上作为静态可执行文件运行)。
它确实有一些皱边,比如
不支持并发
使用 32 位 x86 程序集编写(尽管可以在 x86_64 上运行),如果您想在 x86 或 x86_64 之外的任何其他设备上运行它,您可能需要 qemu 或类似的模拟器
它强大的宏预处理语言是图灵完备的,这意味着你最好对 Lisp、Haskell、XSLT 等语言有一定的经验,或者 M4 可能是最好的选择。
所有要写入输出文件的数据都在内存中的“平面”缓冲区中执行,并且该缓冲区可以增长但不会收缩,直到输出文件已写入且 fasm 终止。这意味着在一次 fasm 运行中最多只能生成与剩余主内存一样大的文件。
每次运行 fasm 时数据只能写入单个输出文件
是的,它是自制的,但非常简洁和聪明