读书人

100分!读取未知位置二进制数据,根据结

发布时间: 2012-03-17 19:06:28 作者: rapoo

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);
}
}

读书人网 >C语言

热点推荐