我在寻找一个脚本(或更高级的程序)语言(或者如模块蟒蛇或类似语言)毫不费力地分析和操纵的二进制数据文件(例如核垃圾场),就像Perl允许操纵文本的文件非常顺利。

我要的事要做,包括提出任意大块的各种形式的数据(二、十进制hex),转换数据从一个endianess到另一个,等等。也就是说,事情你通常会使用或C组,但是我在寻找一种语言,它允许用于编写小块代码非常具体的、一次性用途的速度非常快。

任何建议?

有帮助吗?

解决方案

我想做的事情包括以各种形式(二进制、十进制、十六进制)呈现任意数据块,将数据从一种字节顺序转换为另一种字节顺序等。也就是说,您通常会使用 C 或汇编语言来完成这些事情,但我正在寻找一种语言,它允许非常快速地为高度特定的一次性目的编写小段代码。

好吧,虽然这看起来违反直觉,但我发现 二郎 非常适合于此,即由于其强大的支持 模式匹配, ,甚至对于字节和位(称为“Erlang 位语法”)。这使得创建非常高级的程序来处理字节甚至位级别的数据检查和操作变得非常容易:

自 2001 年以来,函数式语言 Erlang 附带了面向字节的数据类型(称为二进制)以及在二进制上进行模式匹配的结构。

并引用 informIT.com:

(Erlang)与二进制类型结合使用时,图案匹配确实开始变得有趣。考虑一个从网络接收数据包然后对其进行处理的应用程序。数据包中的四个字节可能是网络字节订单数据包类型标识符。在Erlang中,您只需要一个可以将其转换为内部处理的数据结构的单个ProcessPacket函数。看起来像这样:

processPacket(<<1:32/big,RestOfPacket>>) ->
    % Process type one packets
    ...
;
processPacket(<<2:32/big,RestOfPacket>>) ->
    % Process type two packets
    ...

因此,erlang 及其对模式匹配的内置支持以及它作为一种函数式语言的表现力非常强,请参见 erlang 中 ueencode 的实现:

uuencode(BitStr) ->
<< (X+32):8 || <<X:6>> <= BitStr >>.
uudecode(Text) ->
<< (X-32):6 || <<X:8>> <= Text >>.

有关介绍,请参阅 Erlang 中的位级二进制文件和广义推导式您可能还想查看以下一些提示:

其他提示

perl's packunpack ?

蟒蛇 bitstring 模块编写用于这一目的。它可以让你任意片的二进制数据,并提供一些不同的解释通过蟒蛇的性质。它还提供了大量的工具,用于建造和修改的二进制数据。

例如:

>>> from bitstring import BitArray, ConstBitStream
>>> s = BitArray('0x00cf')                           # 16 bits long
>>> print(s.hex, s.bin, s.int)                       # Some different views
00cf 0000000011001111 207
>>> s[2:5] = '0b001100001'                           # slice assignment
>>> s.replace('0b110', '0x345')                      # find and replace
2                                                    # 2 replacements made
>>> s.prepend([1])                                   # Add 1 bit to the start
>>> s.byteswap()                                     # Byte reversal
>>> ordinary_string = s.bytes                        # Back to Python string

也有功能的比特明智的阅读和导航的bitstring,就像在文件;实际上这可以直接从一个文件没有阅读它进入存储器:

>>> s = ConstBitStream(filename='somefile.ext')
>>> hex_code, a, b = s.readlist('hex:32, uint:7, uint:13')
>>> s.find('0x0001')         # Seek to next occurence, if found
True

也有的看法不同endiannesses以及能够交换字节序和更多的事情-看看 手册.

看一看蟒比特串时,它看起来就像你想要什么:)

我使用 010编辑以查看二进制文件都以查看二进制文件的时间。 这是特别面向二进制文件的工作。

它有一个易于使用的c-等脚本语言来解析二进制文件和在一个非常可读的方式呈现它们(作为树中,通过彩色编码字段,这样的东西).. 有一些示例脚本解析zipfiles和bmpfiles。

每当我创建一个二进制文件格式,我总是有点脚本010编辑器来查看文件。如果你有一些结构部分的头文件,使读者对二进制文件是几分钟的事。

用/去分组功能的任何高级语言都行。所有3的Perl,Python和Ruby可以做到这一点。这是个人喜好的问题。我写了一个位二进制分析的在每个这些,并认为红宝石是最简单/最优雅的完成这个任务。

为什么不使用C解释?我总是用他们的片段进行实验,但像你描述的没有太多的麻烦,你可以用一个脚本的东西。

我一直喜欢 EIC 。这是死了,但该项目已被最近复活。 EIC是令人惊讶的能力和相当快。还有 CINT 。既可以编译为不同的平台,但我认为CINT需要在Windows Cygwin的。

蟒蛇的标准图书馆有一些你需要--的 阵列 模块,特别是可以让你很容易阅读的部分的二进制文件,交换字节序等;的 结构 模块允许更精细的解释二进制串。然而,既不是很像你一样丰富,需要:例如,到本相同的数据字节或半,需要复制它之间的两个阵列(的 顽固 第三方加上更强有力的解释同一区域内存在几种不同的方式),并且,例如,显示一些bytes in hex有没有什么"捆绑"超越简单的循环或列表理解这种作为 [hex(b) for b in thebytes[start:stop]].我怀疑有可重复使用第三方的模块,以便利这样的任务又进一步,但我不能点你的一个...

第四,也可以在这个相当不错的,但它是一个有点神秘。

那么,如果速度不考虑,你想的perl,然后二进制的每一行转换成字符线的 - 0和1。是的,我知道有没有换行二进制:)不过相信你有一些固定的大小 - 例如由字节或一些其它单元,使用它可以打破了二进制团块。

然后,只需使用Perl字符串处理该数据:)

如果你正在做的二进制级别的处理,这是非常低的水平,可能需要非常高效且具有最小的依赖性/安装要求。

所以,我会去为C - 处理好字节 - 你也许可以谷歌一些库包是处理字节

喜欢的东西二郎去介绍的低效率,依赖关系,你可能不低级别库希望其他行李。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top