当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 如何从16进制文件中提取数据??
帖子发表于 : 2013-02-07 12:36 
头像

注册: 2006-02-28 3:11
帖子: 2470
送出感谢: 0 次
接收感谢: 0 次
有一个hex的文件, 其结构是
4 byte, seperator , little endian encoding 18385028, hex(84 88 18 01)
4 byte, time, int divisible by 60
8 byte, double
8 byte, double
8 byte, double
8 byte, double
1 byte, char
1 byte, char
这样循环

我想提取这个文件中最后60个循环的所有最后一个8 byte的double 数据, 然后转成10进制, 输出.

不了解hex, 也不知道这个不同的byte有何影响. 若是有cpp的方法就更好了.

先谢谢了

-------------------------------------------
数据
附件:
data.tar [400 KiB]
被下载 25 次


_________________
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.


最后由 yjcong 编辑于 2013-02-07 15:54,总共编辑了 2 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 如何从16进制文件中提取数据??
帖子发表于 : 2013-02-07 14:02 
头像

注册: 2008-07-24 11:33
帖子: 4793
地址: 郑州
送出感谢: 4
接收感谢: 92
定义个struct,一个一个用fread读不行吗?


_________________
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 绿
Site: CUIHAO.TK    Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 如何从16进制文件中提取数据??
帖子发表于 : 2013-02-07 15:50 
头像

注册: 2006-02-28 3:11
帖子: 2470
送出感谢: 0 次
接收感谢: 0 次
cuihao 写道:
定义个struct,一个一个用fread读不行吗?


或许吧. 开头是几行乱七八糟的说明, 从后往前读文件的话, 应该可以. 那个fread, 没用过, 我把cpp当计算器用的.


_________________
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 如何从16进制文件中提取数据??
帖子发表于 : 2013-02-07 20:20 
头像

注册: 2010-04-23 20:40
帖子: 1950
地址: 浙江·杭州
系统: Arch Linux
送出感谢: 2
接收感谢: 31
提供一个样板:
[c]#include <stdio.h>

struct s
{
int i[2];
double d[4];
char c[2];
}
__attribute__((packed))
sd;

int main()
{
FILE * fp = fopen("data", "r");
fseek(fp, -sizeof(sd)*60, SEEK_END);
int i;
for (i=0; i<60; i++) {
fread(&sd, sizeof(sd), 1, fp);
printf("%g\n", sd.d[3]);
}
fclose(fp);
return 0;
}
[/c]
但是,不知道为什么读出来是乱七八糟的东西……
第一个整型也不是18385028……
算了,做个参考吧,具体哪里有问题你们发掘吧


_________________
我是 Giumo Clanjor(哆啦比猫/兰威举)
Where there is a hacker, there is art. | Develop for Developers. (C & perl5)
博客 | Clanjor Prods.
类 C 语言到 brainfuck 编译器


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 如何从16进制文件中提取数据??
帖子发表于 : 2013-02-07 20:34 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
2进制嘛。你还要说明是intel,还是motorola的字序。高位低址/高址的问题。


_________________
● 鸣学


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 如何从16进制文件中提取数据??
帖子发表于 : 2013-02-07 23:52 
头像

注册: 2006-02-28 3:11
帖子: 2470
送出感谢: 0 次
接收感谢: 0 次
eexpress 写道:
2进制嘛。你还要说明是intel,还是motorola的字序。高位低址/高址的问题。

谢谢神啊. 虽然你说的我几乎都不明白.

这是一个数据库的数据. 或许我描述的结构存在一些问题. 但用ghex看的时候, 开头的说明可以正常显示


_________________
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 如何从16进制文件中提取数据??
帖子发表于 : 2013-02-07 23:54 
头像

注册: 2006-02-28 3:11
帖子: 2470
送出感谢: 0 次
接收感谢: 0 次
cjxgm 写道:
提供一个样板:
[c]#include <stdio.h>

struct s
{
int i[2];
double d[4];
char c[2];
}
__attribute__((packed))
sd;

int main()
{
FILE * fp = fopen("data", "r");
fseek(fp, -sizeof(sd)*60, SEEK_END);
int i;
for (i=0; i<60; i++) {
fread(&sd, sizeof(sd), 1, fp);
printf("%g\n", sd.d[3]);
}
fclose(fp);
return 0;
}
[/c]
但是,不知道为什么读出来是乱七八糟的东西……
第一个整型也不是18385028……
算了,做个参考吧,具体哪里有问题你们发掘吧

谢谢. 我一直把C/C++当计算器用, 很少处理这种内容, 看来是有的学了.


_________________
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 如何从16进制文件中提取数据??
帖子发表于 : 2013-02-13 9:11 

注册: 2008-05-24 8:30
帖子: 1453
送出感谢: 2
接收感谢: 30
用C编程好办,用脚本实现的话,可以用 dd 命令拷贝你要的那几个数据,但是它不能显示成10进制数,od 可以显示浮点数,但是得确认格式定义是不是一样的,你可以试一下。也可以完全用 od 操作,不用 dd。

例如显示第11个结构中的最后一个浮点数
代码:
od -j $((42*10+32)) -N8 -tf8 data
0000704   3.386802050258944e+54
0000714


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 如何从16进制文件中提取数据??
帖子发表于 : 2013-02-13 9:19 

注册: 2008-05-24 8:30
帖子: 1453
送出感谢: 2
接收感谢: 30
刚才你那个文件长度不是 42 的整数倍,那么可能是存在文件头的吧。
那就文件尾读的话,显示倒数第10个记录的最后一个浮点数:
代码:
n=$( wc -c < data )
od -j $((n-42*10+32)) -N8 -tf8 data
1415610   1.759219686379341e+15
1415620


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译