如何用perl修改一个二进制文件

xuyunqq 2008-10-07 05:19:02
[要求]
如何把二进制文件中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

请问如何修改才能达到我的要求呢?谢谢了!


...全文
385 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjjdebug 2011-12-25
  • 打赏
  • 举报
回复
it's easy use pack.
reference code:

#!/usr/bin/perl -w
die("Usage: $0 <filename>") if(@ARGV<1);

open(FH, "+>",$ARGV[0]) or die $!;
binmode FH;

for ($i=0; $i< 0x20; $i++)
{
$v=chr(0);
print FH $v;
}

$v=pack "H*","12345678";
seek FH,0x10, 0;
print FH $v
fibbery 2008-10-08
  • 打赏
  • 举报
回复
3楼说反了!你参考这个吧!

# l A signed long (32-bit) value.
# L An unsigned long value.
# q A signed quad (64-bit) value.
# Q An unsigned quad value.
# (Quads are available only if your system supports 64-bit
# integer values _and_ if Perl has been compiled to support those.
# Causes a fatal error otherwise.)
# i A signed integer value.
# I A unsigned integer value.
# (This 'integer' is _at_least_ 32 bits wide. Its exact
# size depends on what a local C compiler calls 'int'.)
# n An unsigned short (16-bit) in "network" (big-endian) order.
# N An unsigned long (32-bit) in "network" (big-endian) order.
# v An unsigned short (16-bit) in "VAX" (little-endian) order.
# V An unsigned long (32-bit) in "VAX" (little-endian) order.
fibbery 2008-10-08
  • 打赏
  • 举报
回复
my $buff=pack("L",0x12345678);#以网络字节顺序保存
fibbery 2008-10-08
  • 打赏
  • 举报
回复
my $buff=pack("L",0x12345678);
fibbery 2008-10-08
  • 打赏
  • 举报
回复
目前,我只找到了这个办法:

use strict;
use warnings;
use IO::File;

my $buff=chr(0x12).chr(0x34).chr(0x56).chr(0x78);
my $f=new IO::File('F:\A.bin','r+');
$f->binmode();
$f->seek(0x10,SEEK_SET);
$f->syswrite($buff,4);

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧