免费注册 查看新帖 |

Chinaunix

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

请教unpack的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-04 09:38 |只看该作者 |倒序浏览
要把一个二进制的文件解成文本的,文档上说明是:

Record  field name, contendsByteType
VersionNum=0x081Hex
RecordType1Hex
RecordLength2Int
TimeStamp4Int

比如读出来的一条记录应该是:

8
1
297
1183450922


我现在用
  1. $blocksize = read(FP,$buffer,2*1024*1024);
  2. print "$blocksize\n";
  3. ($VersionNum,$RecordType,$RecordLength,$TimeStamp) = unpack("h1 h1 n2 L4", $buffer);
复制代码


前面三个字段都能正确读出来,第四个总是不对
上面的代码读出为
8
1
297
18058

我换了所有模式,出来都是18058 (原始文件数据是没错的),请问第四个字段应该怎么读啊??

论坛徽章:
0
2 [报告]
发表于 2007-07-04 09:53 |只看该作者
把格式中的数字都去掉。

论坛徽章:
0
3 [报告]
发表于 2007-07-04 09:58 |只看该作者
try unpack('hhnL', $buffer);
不过很奇怪为什么你要用n和L呢,n能是网络字节序而L不保证呀

论坛徽章:
0
4 [报告]
发表于 2007-07-04 09:59 |只看该作者
多谢,改成这样就可以了
  1. ($VersionNum,$RecordType,$RecordLength,$TimeStamp) = unpack("h h n N", $buffer);
复制代码
为什么呢?什么时候要数字,什么时候不要呢?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2007-07-04 10:03 |只看该作者
原帖由 wyting 于 2007-7-4 09:59 发表
多谢,改成这样就可以了($VersionNum,$RecordType,$RecordLength,$TimeStamp) = unpack("h h n N", $buffer);

搞清楚你需要的到底是 N,还是 I。虽然这两者的效果有时候是一样的。
为什么呢?什么时候要数字,什么时候不要呢?

看 perldoc perlpacktut,本版 apile 前辈曾经发过译文。

论坛徽章:
0
6 [报告]
发表于 2007-07-04 10:09 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2007-07-04 10:14 |只看该作者

回复 #6 nkcsx 的帖子

多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP