免费注册 查看新帖 |

Chinaunix

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

如何读取16进制数据的文件?先进来看看先,别封 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-20 09:06 |只看该作者 |倒序浏览
我搜索了很多16进制的文章可是没我需要的。
我问题是一个有16进制数据组成的文件,内容如下:
(都是16进制度,用OD看的)
bd15 02c7 6f01 1820 0c01 1718 113b 0c01
0019 0100 002c 0000 0000 5831 6f01 ffff
ffff ffff 0000 6f98 ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff 0032
0a39 13f8 0f90 0000 0000 0000 0000 010

例如02c7bd15(16进)-----(10进)46644501

问题:
1。我该如何正确的读到文件里的数值.用过fread,读到一个BUFF中,截取都四个字节,用strtol,去无法正确显示,(redhat9。0 有 longlong 型吗?<c99>)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #define telllist "2001122500.BIL"
  5. #define maxlen 1024*1024*8

  6. main()
  7. {
  8.         FILE *fp;
  9.         char *buff=malloc(maxlen);
  10.         char listtell[118+1];
  11.         char temp[118+1];
  12.         char tep_no[4];
  13.         long No;

  14.         memset(temp,'\0',sizeof(temp));
  15.         memset(tep_no,'\0',sizeof(tep_no));
  16.         fp=fopen(telllist,"rb");
  17.         fread(buff,maxlen,1,fp);
  18.         fclose(fp);

  19.                 strncpy(temp,buff,118);
  20.         strncpy(tep_no,temp,4);
  21.        
  22.         printf("%d\n",atoi(tep_no));
  23.                 //这里显示却为0,如果正确02c7bd15(16进)-----(10进)46644501
  24. 实在苦恼,以前没遇到过
  25. }
复制代码

[ 本帖最后由 roster 于 2005-12-20 10:38 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-12-20 09:22 |只看该作者
强制类型转换就是了

论坛徽章:
0
3 [报告]
发表于 2005-12-20 09:26 |只看该作者
你在看看,FH,我把代码贴上了

论坛徽章:
0
4 [报告]
发表于 2005-12-20 09:35 |只看该作者

  1. memset(temp,'\0',sizeof(temp));
  2.         memset(tep_no,'\0',sizeof(tep_no));
  3.         fp=fopen(telllist,"rb");
  4.         fread(buff,1,maxlen,fp);
  5.         fclose(fp);
  6.         //strncpy(tep_no,temp,4);
  7.         No=(int *)temp;//[color=Red]我在这里加强转,却无法得到预期效果[/color]
  8.         printf("%d\n",No);//[color=Red]显示是负数,应该是超界了[/color]
复制代码

论坛徽章:
0
5 [报告]
发表于 2005-12-20 11:35 |只看该作者
你说的我没听懂,听懂恐怕也不会
不过给你个建议用sprintf保存到定长数组里试一下,
我以前用2进制保存成16进制时候就用的这个函数
我啥也不懂瞎说的,不好用千万别骂我~~~就当帮你顶一下

论坛徽章:
0
6 [报告]
发表于 2005-12-20 12:01 |只看该作者
你说的早试过了。我终于知道神奇的结构类型可以解决一切

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
7 [报告]
发表于 2005-12-20 12:08 |只看该作者
printf("%d\n",atoi(tep_no));
这是什么?
atoi是将字符串转换为整型数, 明显不符
应为:
printf("%ld\n", *(long *)tep_no);

论坛徽章:
0
8 [报告]
发表于 2005-12-20 12:17 |只看该作者
谢谢你的回复,我上面的代码不能表示什么,因为我是在不断的调试,修改,各种可能性。我已经用结构解决了,你的这个办法很好,我发现我在调试的时候少了个*,我是(long *),多加一个*号,到底发生了什么?

[ 本帖最后由 roster 于 2005-12-20 12:22 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP