二进制文件替换数据

昨天一个好朋友,找我帮忙:
       说想定向的修改二进制文件指定位置的数据,希望我能写个脚本,通过某个 csv 文件里面的 定位数据,和对应值,以及数位长度进行修改。
要处理的数据文件:二进制文件替换数据
替换的数据:csv文件的数据:
二进制文件替换数据
问了好半天,他认真的告诉我:A.csv文件里面一行三个信息,第一列是DATA.BIN文件的某个要替换的数据的 偏移地址,第二列是对应地址要替换的值,第三列是要替换的长度,其中要替换的长度都可弄成1字节,到时候他写 csv 文件值的长度写一个字节长度就行了…

好吧,需求出来了,开始分析一下处理方式:
       首先是用啥语言写: 仅仅是对两个文件处理,难度在二进制文件数据处理,似乎一个脚本就足够了,用 python 吧,我挺喜欢这语言工具的,
       其次是怎么处理:文件读取可以用 open 函数,用二进制模式去读,到内存就是一长串01数据,想了很多,搞成 string 对象的话,程序会根据数据去查asscii表,然后能转化成对应的字符,如下面的这样子,确实可以用 eval 转回去:
二进制文件替换数据
但是这样的话,csv 中文件的第一列,0x00013003 怎么去定位?转成10进制之后,77827,去数 ‘\x’ 个数到达 77827 去替换长度
,这样似乎搞的有些复杂,而且用 eval 时候发现 老提示 空值无法替换,没错,就上面的到的 b’ \[email protected] 里面的空格…
        转成字符串肯定太合适,试试别的方式,python 对数据操作很强,你看上面的直接对二进制数据进行切片操作都可以(无意间发现的),切片可以的话,何不写入文件时,根据二进制长度比较上面的 77827 长度定位,然后切片一下(需要补充一下,切片一次操作的是bytes类型的一个字节长度,所以你在上面看到[0:4]有空格和两个\x的形式),写到文件里面去,然后在写对应的 csv 中的值(转成二进制),然后顺着切片后面的继续写到文件里面去,这样不就得了可以了么,切片既然一次能拿到一个字节,循环肯定也是,对于csv中多个数据,弄成列表,然后循环比较长度就行了。

废话那么多,稍稍小结一下用到的必要的函数就上代码呗:(代码以实现为主,调优自己去)
        1.open() 读取二进制文件内容,读取csv文件内容,
        2.将 csv 文件的内容弄成双列表对象,方便等下取数据
        3.for 循环 配合 enumerate 函数对二进制内容循环遍历,当 遍历数等于 csv 中第一列值就开始写入csv文件的值,然后跳过循环,否则就写原二进制文件的值。
        4.for 循环中,取到的二进制值会默认转成 int 类型,用 to_bytes() 函数转成二进制就好了,包括 csv 文件中的要写入的数据也是可以如此操作。

好了,这个脚本就这么多内容了,无业游民开始上代码了:
二进制文件替换数据
结果:
二进制文件替换数据
二进制文件替换数据
二进制文件替换数据