aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 13904|回复: 10

读取结构体的问题

[复制链接]

40

主题

520

回帖

3035

积分

新手入门

超级初学者

积分
3035
发表于 2011-5-21 12:00:28 | 显示全部楼层 |阅读模式
本帖最后由 fantasynew 于 2011-5-21 12:02 编辑

数据保存在二进制文件的0x22~0x25,
用UE查看是 FA 0B 00 00。
windows下的文件数据需要倒过来读,即00 00 0B FA,换算成十进制为3066。
直接移动指针到0x22,
file.read({INT number}).number,读出来的数据符合计算结果。

但是这只是一个大结构体的其中一个数据。如果读入整个结构体,那么读出的数据就不正确了。

dataindex = {
byte code[10];
int daylinenum;
WORD recordindex[25];
}

该结构体保存在0x18~0x57,
data = file.read(dataindex)
data.code结果是正确的,
data.daylinenum却不对了。

到底错在哪里了呢?


40

主题

520

回帖

3035

积分

新手入门

超级初学者

积分
3035
 楼主| 发表于 2011-5-21 22:35:10 | 显示全部楼层
经过计算分析,用大结构体读取,实际上读的是0x24~0x27这四个字节的数据

33

主题

497

回帖

3294

积分

荣誉会员

积分
3294
发表于 2011-5-21 23:35:18 | 显示全部楼层
你可以读出来存放到 str,然后再用 RtlMoveMemory(CopyMemory) 转换到你的数据类型试试看。

40

主题

520

回帖

3035

积分

新手入门

超级初学者

积分
3035
 楼主| 发表于 2011-5-21 23:42:51 | 显示全部楼层
超版说的东西我一点都不懂
能整个结构体读取是最好的,因为还有几个类似的结构体,成员很多,分别读取每个成员代码就复杂了

29

主题

658

回帖

4138

积分

超级版主

积分
4138
发表于 2011-5-21 23:44:54 | 显示全部楼层
本帖最后由 quicker 于 2011-5-21 23:46 编辑

结构体本不是按你认为的那样布局,
你去看看别人写的PEVIEW,用了多少结构体与偏移量,有没有一个字节错的。
即然结构体告诉你正确的偏移地址,那么结论就是你自已瞎猜的是错误的,可是你得出的结论是你自已是对的,结构体他搞错了........... {:soso__16285418229845485015_4:}

40

主题

520

回帖

3035

积分

新手入门

超级初学者

积分
3035
 楼主| 发表于 2011-5-21 23:50:21 | 显示全部楼层
quicker 发表于 2011-5-21 23:44
结构体本不是按你认为的那样布局,
你去看看别人写的PEVIEW,用了多少结构体与偏移量,有没有一个字 ...

我找了很久都没找到哪里写错了。
这个结构体不是我自己瞎写的,是开发文档里提供的结构。
按照结构体的成员分拆开来读取一点都没问题,就是一块读不正确

40

主题

520

回帖

3035

积分

新手入门

超级初学者

积分
3035
 楼主| 发表于 2011-5-21 23:52:19 | 显示全部楼层
测试代码和测试文件我都发出来了
http://bbs.aardio.com/forum.php? ... 1898&highlight=

29

主题

658

回帖

4138

积分

超级版主

积分
4138
发表于 2011-5-22 00:39:59 | 显示全部楼层
把他分成两个不同的结构体来读
{
    int daylinenum;
    WORD recordindex[25];
}

然后从你认为正确的编移开始读。

估计原来的文档有你没有搞明白的地方。

40

主题

520

回帖

3035

积分

新手入门

超级初学者

积分
3035
 楼主| 发表于 2011-5-22 05:30:55 | 显示全部楼层
quicker 发表于 2011-5-22 00:39
把他分成两个不同的结构体来读
{
    int daylinenum;

首先感谢你的回答,但是请看完代码和文件再下结论好吗?
有错误的地方可以指出来,没有严谨分析的结论对解决问题没有帮助的。

回答正确与否我都很感激的,请仔细计算结构体,查看二进制文件。
我已经上传了测试代码和测试文件。
你会发现开发文档描述的并没有错。代码和实例可以验证的。

29

主题

658

回帖

4138

积分

超级版主

积分
4138
发表于 2011-5-22 07:10:57 | 显示全部楼层
本帖最后由 quicker 于 2011-5-22 07:11 编辑

求助有点耐心,
如果你害怕别人指出你的错误,只会离答案越来越远。
把指责我的那几句话用到你自已身上.对解决你的问题有帮助.

结构体需要对齐,本来就不是按你扳了指头算的长度来排列。
上面的回贴已经可以解决你的问题, 把你的不爽先放一放, 把我给的代码仔细去试一下.

dataindex = {
    byte code[10];
}
//在正确的编移读出上面的结构体
dataindex = {
    int daylinenum;
    WORD recordindex[25];
}
//在正确的编移读出上面的结构体

40

主题

520

回帖

3035

积分

新手入门

超级初学者

积分
3035
 楼主| 发表于 2011-5-22 07:34:33 | 显示全部楼层
quicker 发表于 2011-5-22 07:10
求助有点耐心,
如果你害怕别人指出你的错误,只会离答案越来越远。
把指责我的那几句话用到你自已身上.对 ...

sorry,能详细点指出哪部分错了吗?
你这么说我还是不知道哪句写错了
我不知道结构体在文件里是怎么排列的,对照文件一个一个字节数,和文档给出的一样。
我现在用的就是分成两部分来读取,可是没有不拆开就能解决的方法吗?
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-6-15 16:16 , Processed in 0.058513 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表