当前位置:  技术问答>linux和unix

struct结构体竟这般无赖!!!!!!!!!!!!!!!!!!!

    来源: 互联网  发布时间:2016-12-29

    本文导语:  关于结构体遇到了问题哪位帮忙分析下: 就是定义一个BMP格式的结构体用于存储图片的头信息,然后从图片像这个结构体读数据。 结构体如下:typedef struct{      short bfType; //__attribute__((packed));      long  bfSize...

关于结构体遇到了问题哪位帮忙分析下:
就是定义一个BMP格式的结构体用于存储图片的头信息,然后从图片像这个结构体读数据。
结构体如下:typedef struct{
     short bfType; //__attribute__((packed));
     long  bfSize; //__attribute__((packed));
     short bfReserved1;
     short bfReserved2;
     long bfOffBits;
     long biSize;
     long biWidth;
     long biHeight;
     short biPlanes;
     short biBitCount;
     long biCompression;
     long biSizeImage;
     long biXpp;
     long biYpp;
     long biClrUsed;
     long biClrImportant;
}BMPHEAD;

void ShowBMP(char *filename,short x,short y)
{
  BMPHEAD bmp_inf;
  FILE *fp;
  char Tmp,*buf,*buf1,*buf2,c;
  int width,height;
  int red,green,blue;
  long aver_size,size,i,m,j,k;


  fp=fopen(filename,"rb");                    
  
  if(!fp) return;
  fseek(fp,2L,0);                                       
  fread(&bmp_inf.bfSize,1,52,fp); 
.....
}

问题: fseek(fp,2L,0); fread(&bmp_inf.bfSize,1,52,fp);为何像这样从第二个参数开始copy数据就能得到正确的数据?
      而 改成这样,fseek(fp,0,0); fread(&bmp_inf.bfType,1,54,fp)从第一开始就得到的数据不正确?
      还有就是为何sizeof(结构体)的大小都是4的倍数,而不一定就是实际的大小?这样就求大小和处理时就很不准确了。

|
结构体出于地址对齐的原因,会进行调整。结构体的大小,是其成员变量都进行空间地址对齐后的占用内存的大小。而由于32系统架构的内存空间地址对齐的要求一般为4字节对齐,因此sizeof的大小都是4的倍数。 

请参考我的博客:
http://blog.csdn.net/iterzebra/article/details/6232079

http://blog.csdn.net/iterzebra/article/details/6232039


|
结构体会以最长的对齐,比如你的结构体如下,最大的是long类型,在你机器上是4字节,所以实际占用如下
bfType 0 1 [2 3]
bfSize 5 6 7 8
bfReserved1 9 10 
bfReserved2 11 12
bfOffBits 13 14 15 16
虽然bfType实际只用了2个字节,但为了与最大的long对齐,扩展为了4字节。后面bfReserved1, bfReserved2虽然也是2字节,但它们正好填满一个4字节,所以不用扩展。简单来说,结构体以最大类型所占字节数对齐

如果long是8字节,则
bfType 0 1 [2 3 4 5 6 7]
bfSize 8 9 10 11 12 13 14 15
bfReserved1 16 17
bfReserved2 18 19 [20 21 22 23]
bfOffBits 24 25 26 27 28 29 30 31

struct{
  short bfType; //__attribute__((packed));
  long bfSize; //__attribute__((packed));
  short bfReserved1;
  short bfReserved2;
 long bfOffBits;4
 ....
}

|
可以在定义结构体之前添加
#pragma pack(1)
指定结构体不对齐.

|


++

    
 
 

您可能感兴趣的文章:

  • linux 下结构struct ethhdr,struct iphdr在那个头文件下;谢谢!!
  • struct __una_u16结构是什么结构.
  • 在Qt中,不知道如何定义结构变量-struct?
  • 请教struct sembuf的结构是怎样,急!急!急!!!!!!!!
  • ubuntu11.04 task_struct结构
  • linux中有没有这个结构体 struct _pool_st
  • 用g++开发,怎么设置结构(struct)1字节对齐?
  • 知道TCP/UDP的包头,如何判断其应用层协议类型,struct tcphdr和 struct udphdr结构中那个变量能判断应用层协议类型。
  • struct timeval结构体的作用是什么呢?谢谢
  • 进程运行时,内核的哪部分来维护task_struct结构?
  • 求教,2.6.28内核中struct net 结构作用?
  • 请问:unix中struct timeval结构在那个头文件里定义?
  • struct sockaddr_in 这个结构在哪里定义的?
  • struct 结构内存对齐问题.
  • linux网络套接字//accept参数为什么不用struct sockaddr结构体?
  • 求助:在java中如何使用象C中struct的数据结构???
  • struct dirent数据结构到底是怎样的啊???
  • 求教:struct dirent结构中用于存放文件名的d_name,它的长度究竟是1还是255?
  • 如何在用户进程中获取当前进程的task_struct结构地址?
  • IPv4 套接字地址结构转换(char to struct sockaddr_in) 看不懂
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.sql类types的类成员方法: struct定义及介绍
  • typedef_struct与struct之间的区别
  • java命名空间java.sql接口struct的类成员方法: getsqltypename定义及介绍
  • struct sock *sk和 struct sk_buff *skb之间的关系
  • java命名空间java.sql接口struct的类成员方法: getattributes定义及介绍
  • struct task_struct * get_current(void)函数的解释--help!!
  • 任意struct問題
  • Linux内核中work_struct的定义
  • struct 也有构造器吗?
  • struct dirent的问题
  • 关于struct timespec的一个问题
  • 没有名字的struct
  • struct in_addr 和 unsigned long的转换
  • 求解struct的大小
  • Python struct.unpack
  • 请问:从哪个header文件中看struct tty_driver的定义
  • 如何由pid获得task_struct?
  • 谁能否介绍在jbuilder7下怎么使用structs开发web程序么?谢谢!!!!
  • struct 的member对齐问题
  • 关于字符驱动struct cdev的问题
  • 没有名字的struct iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3