免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 15549 | 回复: 6
打印 上一主题 下一主题

请教perl二进制文件的读写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-03 10:27 |只看该作者 |倒序浏览
请教各位
我有一二进制文件需要编辑,例如该二进制文件的内容如下: 01 02 03 04 05 97 02 08 11 12 13 14 97 02 08 33 44 55 66 我需要将里面的97 02 08 改成 97 02 01 。

我参考了以前的帖子,学会了二进制文件的读,但是不知道如何将读出的内容与我需要的内容比较,例如if($buffer == 0x97),我知道这里这么比较是不对的, 因为$buffer是字符,所以想请教应该怎么判断。另外怎么付值呢?比如把08改成01($buffer = 0x01;),我知道这个也不对,因为这样付值后$buffer 变成1的ASCII码31了,写入文件后就不是0x01而变成了0x31。那位知道的麻烦指点一下,谢谢。

while(read(INP, $buffer, 1)) {
                if($buffer == 0x97) {
                        syswrite(OUT, $buffer, length($buffer));
                        read(INP, $buffer, 1);
                        if($buffer == 0x02){
                                syswrite(OUT, $buffer, length($buffer));
                                print "$buffer";
                                read(INP, $buffer, 1);
                                $buffer = 0x01;
                                                        }
                }
                syswrite(OUT, $buffer, length($buffer));
}

论坛徽章:
0
2 [报告]
发表于 2006-05-06 20:16 |只看该作者
哪位高手能给点建议啊?谢谢。

论坛徽章:
0
3 [报告]
发表于 2006-05-06 22:49 |只看该作者
我是菜鸟,哪位高手给个提示或建议吧,应该怎么处理二进制文件里的数值,可以把read读出来的值变成整数而不是字符串吗?怎么通过比较得到要找的9702呢?然后怎么将01代替后面的值?或者从那里可以获得相关资料?谢谢!

论坛徽章:
0
4 [报告]
发表于 2006-05-07 13:51 |只看该作者
主要是两个函数的用法 pack & unpack
详见:http://www.perl.com/doc/manual/html/pod/perlfunc/pack.html

example:

  1. use strict;

  2. my $gifname = "C:\\Documents and Settings\\Administrator\\My Documents\\My Pictures\\1.jpg";
  3. my $gifOutname = "d:\\1111.dat";
  4. my $buff;
  5. open(GIF, $gifname)         or die "can't open $gifname: $!";
  6. open(GIFOUT, ">$gifOutname")         or die "can't open $gifOutname: $!";
  7. binmode(GIF);
  8. binmode(GIFOUT);
  9. read(GIF, $buff, 1);
  10. my $hex = unpack("H*", $buff);
  11. print "ok" if $hex eq "ff";
  12. $hex = "00";
  13. my $outVar = pack("H*", $hex);
  14. print GIFOUT $outVar;
  15. close(GIF);
  16. close(GFIOUT);
复制代码

[ 本帖最后由 clzzclzz 于 2006-5-7 13:52 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-05-07 21:01 |只看该作者
非常感谢!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-05-08 09:28 |只看该作者
根本不用 pack/unpack,
直接 $ch eq "\x97" 就可以了。
再或者 ord($ch) == 0x97 也行。

论坛徽章:
0
7 [报告]
发表于 2006-05-08 13:40 |只看该作者
原帖由 wingger 于 2006-5-8 09:28 发表
根本不用 pack/unpack,
直接 $ch eq "\x97" 就可以了。
再或者 ord($ch) == 0x97 也行。


对这种方法也可以我试过了


  1. use strict;

  2. my $gifname = "C:\\Documents and Settings\\All Users\\Documents\\My Pictures\\示例图片\\Blue hills.jpg";
  3. my $gifOutname = "d:\\1111.dat";
  4. my $buff;
  5. open(GIF, $gifname)         or die "can't open $gifname: $!";
  6. open(GIFOUT, ">$gifOutname")         or die "can't open $gifOutname: $!";
  7. binmode(GIF);
  8. binmode(GIFOUT);
  9. read(GIF, $buff, 2);
  10. my $hex = unpack("H*", $buff);
  11. print "ok" if $hex eq "ffd8";
  12. print "ok2" if $buff eq "\xff\xd8";
  13. $hex = "\x00";
  14. #my $outVar = pack("H*", $hex);
  15. print GIFOUT $hex;
  16. close(GIF);
  17. close(GFIOUT);
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP