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