免费注册 查看新帖 |

Chinaunix

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

困惑了好几天的问题:从二进制文件读一个短整形数,负数不正常 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-22 12:18 |只看该作者 |倒序浏览
perl新手,正在用Tk做一个界面。

读一个二进制文件的时候,遇到一个问题,查了好多资料,也没解决。具体是这样:

先把240字节的数据读到一个buffer里:

if(!read(BIN_FILE,$t_header,240)){

        print "error!";

}

这段240字节dump出来就是这样:
  1:00000000   00000001   0000001B   00000000   
005:00000000   00000012   00000001   00010000   
009:00010000   00000000   00000000   00000000   
013:00000000   00000000   00000000   00000000   
017:00000000   D8F0FF9C   01CEB432   19065BC0   
021:00000000   00000000   00030000   00000000   
025:00000000   00000000   00000000   FF9C0012   
029:0012041B   07D00000   00000000   00000000   
033:00000000   00000000   00000000   00000000   
037:00000000   00000000   00000000   00000000   
041:00000000   00000000   00000000   00000000   
045:00000000   00000000   00000000   00000000   
049:00000000   00000000   00000000   00000000   
053:00000000   00000000   00000000   00000000   
057:00000000   00000000   00000000   00000000

我要读的就是红色的部分FF9C,这样读的:

($tmp,$s_t,$tmp)=unpack("H216 H4 H*",$t_header);

把FF9C读到$s_t里,
FF9C的值本来是-100,可打印出来却不是:

printf "start time=%d\n",hex($s_t);

结果是:
start time=65436

查了几天的资料,还是没搞明白。如果读的短整形数是正值,
则打印出来的就是正确的。



哪位明白高手,指点一下

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
2 [报告]
发表于 2008-10-22 12:39 |只看该作者
printf "start time=%hd\n",hex($s_t);

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
3 [报告]
发表于 2008-10-22 12:41 |只看该作者
为啥要当成有符号数?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2008-10-22 12:49 |只看该作者
unpack 32 位有符号数不能用 H4,得用 i。

论坛徽章:
0
5 [报告]
发表于 2008-10-22 15:41 |只看该作者

回复 #3 ynchnluiti 的帖子

那个位置存储的就是一个有符号的数

论坛徽章:
0
6 [报告]
发表于 2008-10-22 15:42 |只看该作者

回复 #4 flw 的帖子

不是32的的,是一个16位的有符合的整形。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2008-10-22 15:51 |只看该作者
原帖由 fanfan 于 2008-10-22 15:42 发表
不是32的的,是一个16位的有符合的整形。

16 位的用 s。

论坛徽章:
0
8 [报告]
发表于 2008-10-22 16:05 |只看该作者
用s就有big-endian 或者small-endian的问题了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2008-10-22 16:48 |只看该作者
原帖由 fanfan 于 2008-10-22 16:05 发表
用s就有big-endian 或者small-endian的问题了

只要和 Real World 之间有 IO,就会有这个问题。你好好整理整理思路吧。我实在不想再说什么了。

BTW:网络格式用 n。

[ 本帖最后由 flw 于 2008-10-22 16:50 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-10-22 18:56 |只看该作者
先谢谢了。

本来想偷个懒的

从c转到perl,在数据类型上还真不习惯
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP