Scripting 什么语言是二进制语言,就像Perl是文本语言一样?

Scripting 什么语言是二进制语言,就像Perl是文本语言一样?,scripting,binary-data,patch,fileparsing,Scripting,Binary Data,Patch,Fileparsing,我正在寻找一种脚本(或更高级别的编程)语言(或Python模块或类似语言),可以轻松地分析和操作文件中的二进制数据(例如核心转储),就像Perl允许非常顺利地操作文本文件一样 我想做的事情包括以各种形式(二进制、十进制、十六进制)呈现任意数据块,将数据从一个端点转换为另一个端点,等等。也就是说,通常使用C或汇编语言,但我正在寻找一种允许为高度特定的,一次性用途非常快 有什么建议吗?perl和?任何带有打包/解包函数的高级编程语言都可以。所有3个Perl、Python和Ruby都可以做到这一点。这

我正在寻找一种脚本(或更高级别的编程)语言(或Python模块或类似语言),可以轻松地分析和操作文件中的二进制数据(例如核心转储),就像Perl允许非常顺利地操作文本文件一样

我想做的事情包括以各种形式(二进制、十进制、十六进制)呈现任意数据块,将数据从一个端点转换为另一个端点,等等。也就是说,通常使用C或汇编语言,但我正在寻找一种允许为高度特定的,一次性用途非常快


有什么建议吗?

perl和?

任何带有打包/解包函数的高级编程语言都可以。所有3个Perl、Python和Ruby都可以做到这一点。这是个人喜好的问题。我在每一篇文章中都写了一些二进制解析,觉得Ruby对于这项任务来说是最简单/最优雅的。

为什么不使用C解释器呢?我总是用它们来试验代码片段,但你可以用它来编写你所描述的东西,而不需要太多麻烦


我一直都很喜欢。它已经死了,但这个项目最近又重新启动了。EiC的能力令人惊讶,速度也相当快。还有。虽然我认为CINT需要windows上的Cygwin,但它们都可以为不同的平台编译

Python的标准库提供了一些您需要的功能,特别是该模块可以让您轻松地读取部分二进制文件、交换端号等;该模块允许对二进制字符串进行更细粒度的解释。但是,这两种方法都没有您所要求的那么丰富:例如,要以字节或半字的形式显示相同的数据,您需要在两个数组之间进行复制(第三方插件在以几种不同方式解释相同的内存区域方面要强大得多),并且,例如,要以十六进制显示某些字节,没有什么“捆绑”的除了简单的循环或列表理解之外,例如
[字节中b的十六进制(b)[开始:停止]]
。我怀疑有可重用的第三方模块可以进一步促进此类任务,但我不能为您指出一个…

我一直使用它来查看二进制文件以查看二进制文件。 它特别适合于处理二进制文件

它有一个易于使用的类似c的脚本语言来解析二进制文件,并以非常可读的方式呈现它们(如树、按颜色编码的字段等等)。。 有一些示例脚本可以解析zipfiles和bmpfiles

每当我创建二进制文件格式时,我总是为010编辑器制作一个小脚本来查看文件。如果您有一些带有结构的头文件,那么为二进制文件制作一个读取器只需几分钟

我想做的事情包括以各种形式(二进制、十进制、十六进制)呈现任意数据块,将数据从一个端点转换为另一个端点,等等。也就是说,通常使用C或汇编语言,但我正在寻找一种允许为高度特定的,一次性用途非常快

好吧,虽然这看起来有点违反直觉,但我发现它非常适合这种情况,也就是说,由于它对字节和位(称为“”)的强大支持。这使得创建甚至非常高级的程序非常容易,这些程序可以在字节甚至位级别上检查和操作数据:

自2001年以来,函数式语言Erlang提供了一种面向字节的数据类型(称为binary)和用于在二进制文件上进行模式匹配的结构

并引述:

(Erlang)模式匹配真的开始变得越来越重要 与二进制文件结合时的乐趣 类型。考虑一个应用程序 从网络接收数据包,然后 然后处理它们。中的四个字节 数据包可能是网络字节顺序 包类型标识符。在二郎,你 只需要一个processPacket 可以将其转换为 内部数据结构 处理。它看起来像什么 像这样:

processPacket()->
%进程类型1数据包
...
;
processPacket()->
%进程类型2数据包
...
因此,erlang内置了对模式匹配的支持,并且是一种功能性语言,非常具有表现力,例如,请参见erlang中ueencode的实现:

uuencode(BitStr) ->
<< (X+32):8 || <<X:6>> <= BitStr >>.
uudecode(Text) ->
<< (X-32):6 || <<X:8>> <= Text >>.
uuencode(比特串)->
.
uudecode(文本)->
.
有关介绍,请参阅。您可能还想查看以下一些指针:


如果您正在进行二进制级别的处理,它的级别非常低,可能需要非常高效,并且依赖性/安装要求最低

所以我会选择C语言——很好地处理字节——你可能可以在谷歌上搜索一些处理字节的库包


使用诸如Erlang之类的工具会带来低效率、依赖性和其他一些您可能不希望在低级库中遇到的问题。

Forth在这方面也可以做得很好,但它有点神秘。

看看,它看起来正是您想要的:)

如果速度不是一个考虑因素,而您需要perl,然后将每行二进制文件转换成一行字符-0和1。是的,我知道二进制代码中没有换行符:),但您可能有一些固定的大小——例如,按字节或其他单位,您可以使用它们来分解二进制blob

然后对该数据使用perl字符串处理:)

Python模块就是为此而编写的。它允许您对二进制数据进行任意切片,并通过Python属性提供许多不同的解释。它还提供了大量用于构造和修改二进制数据的工具

例如:

>>> 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
在位字符串中还有一些用于按位读取和导航的函数,与中的类似
>>> 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
>>> 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