如何修改一个二进制文件

如何修改一个二进制文件

[要求]
如何把二进制文件中A开始偏移0x10开始的四个字节修改为0x12345678

[文件A]
修改前:
0x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

修改后:
0x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0010 78 56 34 12 00 00 00 00 00 00 00 00 00 00 00 00


[已经做的工作]
#!/usr/bin/env perl

$OFFSET = 16; # offset in file, in bytes
$VALUE = 0x12345678;

open(FH, "+<A") || die "can't update somewhere: $!";
binmode(FH);

seek(FH, $OFFSET , 0);

print FH $VALUE; #要修改的也就是这个地方了

close FH;

输出:
0x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0010 30 78 31 32 33 34 35 36 37 38 00 00 00 00 00 00

如果把那句print语句修改为print FH pack("H8",$VALUE);
那输出就变为:
0x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0010 01 12 34 56 00 00 00 00 00 00 00 00 00 00 00 00

请问如何修改才能达到我的要求呢?谢谢了!
pack("L",$VALUE);
可以详细点吗,知道要修改内容的偏移量,能否用函数实现,正则在大文件下太慢。
谢谢
seek 和 readline/print 不能混用。
用 sysread 和 syswrite 吧。


QUOTE:
原帖由 nelfking 于 2008-11-24 11:42 发表
可以详细点吗,知道要修改内容的偏移量,能否用函数实现,正则在大文件下太慢。
谢谢

你是要获得已知内容的偏移量,还是要修改已知偏移量的内容?如果是前者只能读出内容来判断。
如果是后者不需要正则,直接使用sysseek定位文件偏移量。
不好意思,最近在忙另一个任务,现在才来请教
我用的windows操作系统,用syseek,sysread会不会有问题?
我的问题是一个很大的16进制文件,
在偏移量2AA5处是000000,我想修改成FF0000,除了用正则表达式有没有更好的方法?
如果一行行扫描的话,感觉效率低下
谢谢,可以有人来帮忙回答下吗?
自己解决
最笨的办法(正则表达式)...