首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

100分!读取未知位置二进制数据,根据结果跳转到其他位置解决思路

2012-03-17 
100分!读取未知位置二进制数据,根据结果跳转到其他位置问题是这样的,二进制的操作我一般用结构体完成,但如

100分!读取未知位置二进制数据,根据结果跳转到其他位置
问题是这样的,二进制的操作我一般用结构体完成,但如果无法定义精确的结构体的时候,如何操作?

如下图,全部为512B即1扇区

我先要读取0C0007E14(第二行4的地方),长度为2B,即38   00,按高低位是00为高位,38为低位,即0038,十六进的38,十进的56

根据38h这个相对于开头位置0C0007E00的偏移找到0C0007E38,即第四行8的位置,这里的长度是4B

10   00   00   00根据高低位为00   00   00   10,即十六进的10,十进的16

然后读10   00   00   00后面的60   00   00   00,根据高低位为00   00   00   60,即十六进的60,十进的96

然后以10   00   00   00的位置0C0007E38为基准,后面偏移60h的地方找到30   00   00   00(第十行8的位置)

30   00   00   00根据高低位为30   00   00   10,即十六进的30,十进的48

然后读30   00   00   00后面的68   00   00   00,根据高低位为00   00   00   68,即十六进的68,十进的104

然后以30   00   00   00的位置0C0007E98为基准,好像上面一样类推,后面偏移68h的地方找到80   00   00   00(倒数第16行0的位置)

然后根据80   00   00   00后面的48   00   00   00找到B0   00   00   00(倒数第12行8的位置)
下面就是类推的过程

我的问题是,最开始的38h位置和长度我是知道的,可以根据它找到10   00   00   00,根据10   00   00   00后面的60   00   00   00得到偏移60找30   00   00   00

但60   00   00   00这个数是不确定的,可能是70   00   00   00   或80   00   00   00什么的,就是它的后续数的位置偏移是不定的

或者60   00   00   00的长度不是4B而是2B,取60   00,处理的方式又不一样了
我无法用结构体来定义和操作

但用数组,比如array[512]的话,遇到不同长度的数值时计算很麻烦,如上面就有2B,4B的长度,还涉及到高低位的问题

请问我应该用什么方法处理才能比较好

分不够的话开帖再加,先多谢各位(顶也给分)

Offset               0     1     2     3     4     5     6     7       8     9     A     B     C     D     E     F

0C0007E00       46   49   4C   45   30   00   03   00     1F   04   59   09   00   00   00   00      
0C0007E10       01   00   01   00   38   00   01   00     A0   01   00   00   00   04   00   00      
0C0007E20       00   00   00   00   00   00   00   00     06   00   00   00   00   00   00   00      
0C0007E30       1A   01   00   00   00   00   00   00     10   00   00   00   60   00   00   00      
0C0007E40       00   00   18   00   00   00   00   00     48   00   00   00   18   00   00   00      
0C0007E50       A4   1E   70   8A   72   A7   C7   01     A4   1E   70   8A   72   A7   C7   01    
0C0007E60       A4   1E   70   8A   72   A7   C7   01     A4   1E   70   8A   72   A7   C7   01    
0C0007E70       06   00   00   00   00   00   00   00     00   00   00   00   00   00   00   00      
0C0007E80       00   00   00   00   00   01   00   00     00   00   00   00   00   00   00   00      


0C0007E90       00   00   00   00   00   00   00   00     30   00   00   00   68   00   00   00      
0C0007EA0       00   00   18   00   00   00   03   00     4A   00   00   00   18   00   01   00      
0C0007EB0       05   00   00   00   00   00   05   00     A4   1E   70   8A   72   A7   C7   01      
0C0007EC0       A4   1E   70   8A   72   A7   C7   01     A4   1E   70   8A   72   A7   C7   01      
0C0007ED0       A4   1E   70   8A   72   A7   C7   01     00   00   D2   03   00   00   00   00    
0C0007EE0       00   00   D2   03   00   00   00   00     06   00   00   00   00   00   00   00  
0C0007EF0       04   03   24   00   4D   00   46   00     54   00   00   00   00   00   00   00  
0C0007F00       80   00   00   00   48   00   00   00     01   00   40   00   00   00   01   00
0C0007F10       00   00   00   00   00   00   00   00     1F   3D   00   00   00   00   00   00
0C0007F20       40   00   00   00   00   00   00   00     00   00   D2   03   00   00   00   00
0C0007F30       00   00   D2   03   00   00   00   00     00   00   D2   03   00   00   00   00
0C0007F40       32   20   3D   00   00   0C   00   00     B0   00   00   00   50   00   00   00  
0C0007F50       01   00   40   00   00   00   05   00     00   00   00   00   00   00   00   00  
0C0007F60       01   00   00   00   00   00   00   00     40   00   00   00   00   00   00   00
0C0007F70       00   20   00   00   00   00   00   00     90   1E   00   00   00   00   00   00
0C0007F80       90   1E   00   00   00   00   00   00     31   01   FF   FF   0B   31   01   55
0C0007F90       A0   FD   00   E1   74   02   85   F4     FF   FF   FF   FF   00   00   00   00
0C0007FA0       00   80   00   00   00   00   00   00     31   08   00   00   0C   00   01   00
0C0007FB0       B0   00   00   00   48   00   00   00     01   00   40   00   00   00   05   00
0C0007FC0       00   00   00   00   00   00   00   00     00   00   00   00   00   00   00   00


0C0007FD0       40   00   00   00   00   00   00   00     00   10   00   00   00   00   00   00
0C0007FE0       08   00   00   00   00   00   00   00     08   00   00   00   00   00   00   00
0C0007FF0       31   01   FF   FF   0B   00   00   00     FF   FF   FF   FF   00   00   1A   01

[解决办法]
SF吗?
[解决办法]
问题是这样的,二进制的操作我一般用结构体完成,但如果无法定义精确的结构体的时候,如何操作?
==================
那就使用 char buffer[] 把,
然后根据实际情况,
从指定位置读取指定长度的数据fgets(),
然后将 buffer 解析,比如使用 sscanf 赋值其他类型的变量等 ...
[解决办法]
或者60 00 00 00的长度不是4B而是2B,取60 00,处理的方式又不一样了

----------------------

这个有问题啊,如果你的数据格式不固定,是无法使用通用的数据结构来读的啊

比如上面的

起码 长度(4B或者2B) 在你处理数据的时候是知道的

或许可以根据这个长度使用模版结构来读取你的数据


问题是,你在读取前,难道确定这些,比如上面的长度,是如果确定的
[解决办法]
用一个变量存储下一个位置的坐标,把目标数据放在vector里。

取到下一位置的坐标,读取目标数据,转换byte为int,2B或者4B,放入vector,偏移文件指针到下一文件指针位置处,读取下一文件指针位置,读取目标数据。
vector <int> data;
int nextPos = 0;
const int step = 2; // step = 4;
unsigned int temp[step];

File* file = fopen(...);
读取nextPos 为 0x0038; // 第一次时比较特殊
while (末到文件尾) {
// 这里假设下一数据的偏移位置是针对文件头的,如是相对偏移量,进行简单处理即可。
fseek(file, (long)nextPos, SEEK_SET);

fread(temp, step, 1, file); // 把step个字节读入temp中,temp中按高位到低位存放。
// 转换数据
for (int i = 0; i < step; i++) {
int tmp = temp[i] < < (4 * (step - i - 1));
// 如0x78 0x56 0x34 0x12: 0x78 < < 4*3 + 0x56 < < 4*2 + 0x34 < < 4*1 + 0x12 < < 4*0;
vector.push_back(tmp);
}
}

热点排行