Linux shell 如何更新二进制文件中间的一个字节?
How to update a byte in the middle of binary file in Linux shell?
当我 运行 cmp
在 2 个文件上我得到一个字节的差异:
cmp -l file1.dmp_byte file2.dmp
913462 0 100
如何用值 100 更新文件 file1.dmp 的字节 913462?
可以使用标准 Linux shell 工具或 Python 来完成吗?
在 Python 中,您可以使用内存映射文件:
import mmap
with open('file1.dmp', 'r+b') as fd:
mm = mmap.mmap(fd.fileno(), 0)
mm[913462] = chr(100)
mm.close()
我接受了答案,但选择了不同的解决方案
def patch_file(fn, diff):
for line in diff.split(os.linesep):
if line:
addr, to_octal, _ = line.strip().split()
with open(fn , 'r+b') as f:
f.seek(int(addr)-1)
f.write(chr(int (to_octal,8)))
diff="""
3 157 266
4 232 276
5 272 273
6 16 25
48 64 57
58 340 0
64 1 0
65 104 0
66 110 0
541 61 60
545 61 60
552 61 60
559 61 60
20508 15 0
20509 157 0
20510 230 0
20526 10 0
20532 15 0
20533 225 0
20534 150 0
913437 226 0
913438 37 0
913454 10 0
913460 1 0
913461 104 0
913462 100 0
"""
patch_file(f3,diff)
当我 运行 cmp
在 2 个文件上我得到一个字节的差异:
cmp -l file1.dmp_byte file2.dmp
913462 0 100
如何用值 100 更新文件 file1.dmp 的字节 913462?
可以使用标准 Linux shell 工具或 Python 来完成吗?
在 Python 中,您可以使用内存映射文件:
import mmap
with open('file1.dmp', 'r+b') as fd:
mm = mmap.mmap(fd.fileno(), 0)
mm[913462] = chr(100)
mm.close()
我接受了答案,但选择了不同的解决方案
def patch_file(fn, diff):
for line in diff.split(os.linesep):
if line:
addr, to_octal, _ = line.strip().split()
with open(fn , 'r+b') as f:
f.seek(int(addr)-1)
f.write(chr(int (to_octal,8)))
diff="""
3 157 266
4 232 276
5 272 273
6 16 25
48 64 57
58 340 0
64 1 0
65 104 0
66 110 0
541 61 60
545 61 60
552 61 60
559 61 60
20508 15 0
20509 157 0
20510 230 0
20526 10 0
20532 15 0
20533 225 0
20534 150 0
913437 226 0
913438 37 0
913454 10 0
913460 1 0
913461 104 0
913462 100 0
"""
patch_file(f3,diff)