类似于shell的二进制处理环境


15

这个问题前几次出现在我面前,现在是对问题的回应,它 来自Bash中stdin的二进制数据块,/programming/993434/what-language-is-to-binary中给出按文本进行操作也不令人满意。

我正在寻找一个专门用于处理二进制文件I / O的脚本环境。我知道我可以使用一种成熟的编程语言(c / Python / ...),但是它们有巨大的初始化和编码开销(c中的分配和fread / fwrite,Python中的位串...)更不用说它们不太适合编写脚本(从中调用其他应用程序)。Perl的unpack功能,面向字符串的操作和愚蠢的语法没有更好的选择。

类似od,但作为一种语言。

我的期望:

  1. 使用单个开关/命令设置或更改字节序。
  2. 请求类型的简单的规范(像延伸的bash read varint32 varfloat var等)。
  3. 通过管道处理二进制,跳过指定的字节数。
  4. 我们习惯的标准脚本流控制(for / if / ...)。

我想以与检查ASCII文件时一样的便捷性和洞察力来处理原始数据(摄影,科学数据,未知和记录不良的格式)。我现在正在使用c,但是它不是临时脚本的最佳选择,并且不能交互。

有谁知道这样的工具?请没有clicky GUI软件,它需要通过ssh,其他脚本等工作。“不存在”是可以接受但令人沮丧的答案。


2
它并没有消除启动时间的麻烦,但是我发现Python 3.3中的字节以及铅锤非常有用:chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()您看过吗?
Anthon 2014年

您可以使用现在拥有的C代码,并将其变成可以在bash脚本中使用的一组命令行工具。虽然不能将二进制文件放入shell变量中,但是可以将其存储在命名('fifo')管道中;它们的内容将保留在内存中,直到您要阅读它们为止。
goldilocks 2014年

1
在推理WRT python和perl,BTW时存在严重缺陷。虽然编译了各个命令行工具,但shell脚本却不是,并且涉及很多分支(如果您想要昂贵的分支,就是它)。您的讨论,其他问题等等,意味着如果可以处理二进制文件,则可以在此处使用bash很好。Python和Perl脚本预编译。如果您对相当复杂的python或perl脚本与并行bash脚本进行基准比较,则perl或python 的速度将提高一个数量级。如果您不相信我,欢迎您在网上搜索相反的证据。
goldilocks 2014年

我不是在寻找运行速度快的工具,而是在寻找可以快速编码的东西。例如,如果我有一个奇怪的程序输出一个二进制int表示其后跟随的结构(int,float,float)的数组大小,那么我想快速读取数组大小并遍历数组,可能会计算一些累积或最大化某些组件,或仅将一个组件作为ascii列打印以进行gnuplot处理。Anthon:谢谢,我对此一无所知,这将很有用。goldilocks:我试图避免这种情况,但是我可能只在最后写我自己的工具:)
Orion 2014年

2
像你这样的声音需要有关如何使用教程perlunpack(ᵔᴥᵔ)
斯特凡Chazelas

Answers:


2

多年来,我确实也遇到了与您完全相同的问题。

对于简单的非交互式用途,我喜欢使用二进制块编辑器BBE。BBE是二进制文件,SED是文本文件,包括其古老的语法和简单性,但是,它具有许多我经常需要的功能,因此我必须将其与其他工具结合使用。因此,BBE只是部分解决方案。另请注意,BBE多年来没有任何更新或改进。

当然,可以在使用基于文本的工具编辑数据xxd之前和xxd -r之后使用,但是当所讨论的数据很大且需要随机访问时(例如在处理块设备时),该方法将无效。

(注意:对于Windows,至少有一种昂贵的专有WinHex脚本语言,但这无法帮助我们。)

对于更复杂的二进制编辑,即使对于大文件有时速度太慢,我通常也会使用Python,这是它的主要缺点。我希望Pyston(使用LLVM编译为优化的机器代码的Python)有一天会成熟到可以使用,甚至更好,有人会设计和实现一种免费的紧凑,快速和通用的二进制处理脚本语言,而AFAIK并不存在这种语言。 U * IX类似于系统。

更新

我还碰巧使用了自制的,开源的Intel x86汇编程序平面汇编程序,简称fasm,它演变成不仅仅是汇编程序。

它具有强大的,基于文本块的宏预处理器(本身是一种完整的语言),具有borland turbo汇编器宏语言的传统语法,但功能更加先进。

此外,它还具有一种数据处理语言,该语言允许二进制包含任意文件,在“编译时”对其进行各种二进制和算术处理(仅整数),并将结果写入输出文件。这种数据处理语言具有控制结构,并且也将完善。

它比编写用C甚至可能使用python进行二进制操作的程序要容易得多。另外,它的加载速度非常快,因为它是一个小型的可执行文件,几乎没有任何外部依赖(有2个版本:要么只需要libc,要么可以直接在Linux内核ABI上作为静态可执行文件运行)。

它确实有一些颈圈边缘,例如

  1. 不支持并发

  2. 在32位x86汇编中编写(尽管可在x86_64上运行),如果要在x86或x86_64以外的其他任何设备上运行它,则可能需要qemu或类似的模拟器

  3. 它强大的宏预处理器语言正在完善中,这意味着您最好对Lisp,Haskell,XSLT等语言有一定的经验,或者可能最好选择M4。

  4. 所有要写入输出文件的数据都在内存中的“平面”缓冲区中执行,并且该缓冲区可以增长,但不会缩小,直到已写入输出文件并终止fasm。这意味着一次生成的文件最多只能生成与您拥有的主内存一样大的文件。

  5. 每次fasm运行时,数据只能写入单个输出文件

  6. 是的,它是自制的,虽然真的很整洁聪明


2

您不必一定要与Perl的解包“保持和平”……关于perl的一大优点是如何在自定义程序包中滥用解析器和符号表来制作自己的语言。

这基本上就是您要找的东西吗?

use MyBinLib;
my $struct= struct(
  pack => 8,
  size => 400,
  fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
  printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}

然后的练习是学习足够的perl来编写MyBinLib包。在Perl论坛中提问,人们可能会很乐意为您提供帮助。


1

您是否遇到过beav宏,但我找不到脚本,

apt-cache show beav 提取物:

使用beav,您可以用HEX,ASCII,EBCDIC,OCTAL,DECIMAL和BINARY编辑文件。您可以在FLOAT模式下显示但不能编辑数据。您可以使用以下任何一种模式进行搜索或搜索和替换。数据可以BYTE,WORD或DOUBLE WORD格式显示。在显示单词或双字时,数据可以按英特尔或摩托罗拉的字节顺序显示。任何长度的数据都可以插入文件中的任何位置。此数据的来源可以是键盘,另一个缓冲区或文件。可以将所显示的任何数据以所显示的格式发送到打印机。可以处理大于内存的文件。

然后有xxd转换成二进制/ ASCII显示模式的工具,可以与sed或组合在一起vi,但没有字节交换功能。


0

您总是可以争先恐后地进入C或ASM。如果您正在使用原始二进制文件,则将其直接从寄存器中弹起。您“已经在那里”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.