免费注册 查看新帖 |

Chinaunix

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

请教一个关于结构体的笨问题~~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-11 00:49 |只看该作者 |倒序浏览
今天写了一个段小程序来读位图的文件头。如下:

struct BitMapHeader
{
    WORD     bfType;                // 2 bytes
    DWORD    bfSize;                // 4 bytes
    WORD     bfReserved1;       // 2 bytes
    WORD     bfReserved2;       // 2 bytes
    DWORD    bfOffBits;            //  4 bytes
};

可是读进了以后,得不到正确的答案。(应该不是读取的错误)
它中间有两个域得到的数据 错开了两个字节……

而且,我发现一个问题。
该结构的全部域大小加起来为: 2 + 4 + 2 + 2+ 4 = 14
为什么:   sizeof(BitMapHeader) == 16
???

论坛徽章:
0
2 [报告]
发表于 2004-06-11 07:37 |只看该作者

请教一个关于结构体的笨问题~~~

系统为了自己的需要,会在结构体中添加若干字节。

论坛徽章:
0
3 [报告]
发表于 2004-06-11 10:13 |只看该作者

请教一个关于结构体的笨问题~~~

这个结构体中第一个最大的bfSize,bfOffBits是4,在此之前的bfType只有2,所以为之分配4;后面的bfReserved1和bfReserved2的和为4;所以一共为16。

论坛徽章:
0
4 [报告]
发表于 2004-06-11 11:40 |只看该作者

请教一个关于结构体的笨问题~~~

我还是想不懂,把这个问题贴出来,老大们帮忙看看吧

比如我的BMP文件头的信息为:(开头的16个字节)
42 4D 66 FB 00 00 00 00 00 00 36 04 00 00 28 00
按我的想法,它是要读:
WORD     bfType;          =  42 4D
DWORD    bfSize;          =  66 FB 00 00
WORD     bfReserved1;     =  00 00
WORD     bfReserved2;     =  00 00
DWORD    bfOffBits;       =  36 04 00 00
(共14个bytes)
但它给我读回来的是:
WORD     bfType;          =  42 4D
DWORD    bfSize;          =  00 00 00 00
WORD     bfReserved1;     =  00 00
WORD     bfReserved2;     =  36 04
DWORD    bfOffBits;       =  00 00 28 00
多的那两个字节也不晓得它给我放到哪里的,而
第二个域又跳过来 66 FB 两个字节……
搞糊涂了~~  恳请指点~~  

其实VC里自定义了这个结构 BITMAPFILEHEADER,但是它定义这个 sizeof 就是14个字节! 一模一样的!读进来结果就是正确的!!请教了一个师兄,说好象有个什么语句可以让它不多分配空间。但是他记不到了……

论坛徽章:
0
5 [报告]
发表于 2004-06-11 12:20 |只看该作者

请教一个关于结构体的笨问题~~~

#pragma pack(push,1)  //1字节对齐,并压入系统默认的n字节对齐

//定义你的结构


#pragma pack(pop)  //恢复系统默认值

论坛徽章:
0
6 [报告]
发表于 2004-06-11 16:13 |只看该作者

请教一个关于结构体的笨问题~~~

系统对齐的调整。
4字节对齐是32位机的做法
如果你不想让对齐方式影响到取值的正确性,那就一个成员一个成员的赋值。
想一次性拷贝就按照linux_newbie 老大说的做,自己定义对齐方式或不允许对齐调整unpacked

论坛徽章:
0
7 [报告]
发表于 2004-06-11 22:09 |只看该作者

请教一个关于结构体的笨问题~~~

搞懂了~~谢谢~~

论坛徽章:
0
8 [报告]
发表于 2004-06-12 20:10 |只看该作者

请教一个关于结构体的笨问题~~~

有没有人知道Excel电子表格文件的文件头内容?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP