免费注册 查看新帖 |

Chinaunix

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

C结构体组包字节对齐问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-20 10:53 |只看该作者 |倒序浏览
我在用struct定义包结构的时候,发现发送出去的包,并不是按照我定义字节数量发送出去,总是因为对齐或多或少字节。好麻烦!

如下代码:
typedef unsigned char UCHAR;
typedef unsigned short USHORT;
typedef unsigned long ULONG;

struct SSX_REQ_HDR_NEGO
{
  UCHAR WordCount;        /* Count of parameter words = 13 */
  UCHAR AndXCommand;        /* Secondary (X) command; 0xFF = none */
  UCHAR Reserved1;
  UCHAR AndXOffset[2];        /* Offset to next command WordCount */
  UCHAR MaxBufferSize[2];    /* Client's maximum buffer size */
  UCHAR MaxMpxCount[2];        /* Actual maximum multiplexed pending requests */
  UCHAR VcNumber[2];        /* 0=first (only),nonzero=additional VC number */
  UCHAR SessionKey[4];        /* Session key (valid iff VcNumber != 0) */
  UCHAR BlobLength[2];
  UCHAR Reserved2[4];        /* must be 0 */
  UCHAR Capabilities[4];    /* Client capabilities */
  UCHAR ByteCount[2];        /* Count of data bytes; min = 0 */
  UCHAR Other[95];
  //STRING NativeOS[];          /* Client's native operating system, Unicode */

  //STRING NativeLanMan[];      /* Client's native LAN Manager type, Unicode */

};

//struct SSX_REQ_HDR

//{

//      UCHAR WordCount;                /* Count of parameter words = 13 */

//  UCHAR AndXCommand;          /* Secondary (X) command; 0xFF = none */

//  UCHAR AndXReserved;         /* Reserved (must be 0) */

//  USHORT AndXOffset;          /* Offset to next command WordCount */

//  USHORT MaxBufferSize;               /* Client's maximum buffer size */

//  USHORT MaxMpxCount;         /* Actual maximum multiplexed pending requests */

//  USHORT VcNumber;            /* 0=first (only),nonzero=additional VC number */

//  ULONG SessionKey;           /* Session key (valid iff VcNumber != 0) */

//  USHORT BlobLength;

//  ULONG Reserved;             /* must be 0 */

//  ULONG Capabilities;         /* Client capabilities */

//  USHORT ByteCount:;          /* Count of data bytes; min = 0 */

//  UCHAR Other[95];

//  //STRING NativeOS[];          /* Client's native operating system, Unicode */

//  //STRING NativeLanMan[];      /* Client's native LAN Manager type, Unicode */

//};



这个程序如果用下面注释掉的结构体的话,就会在AndXOffset和MaxBufferSize之间出现多个0x00,如果用第一个结构体的话,就不回有问题!难道只能用unsigned char一个个定义啊!

我用了下域定义,可是程序报错,请问下,怎么解决这个问题!?????

论坛徽章:
0
2 [报告]
发表于 2007-12-20 11:02 |只看该作者
这是内存对其的用法

结构体前加个宏就可以了

#pragma pack(1)
struct SSX_REQ_HDR {...};

论坛徽章:
0
3 [报告]
发表于 2007-12-20 11:03 |只看该作者

#pragma push()
#pragma pack(1)
struct xxxx
{
...
...
};
#pragma pop()

强制一字节对齐

[ 本帖最后由 hewangping 于 2007-12-20 11:06 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-12-20 11:07 |只看该作者
更改C编译器的缺省字节对齐方式
在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:
     · 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
     · 使用伪指令#pragma pack (),取消自定义字节对齐方式。

另外,还有如下的一种方式:
     · __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
     · __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。
××××××××××××××××××××××××××××
上面都是我从别的地方转的。据我从LKD书上看的,作者说自己写结构体时主动把小字节的凑成自然对齐的顺序也是一种办法。不过如果已经规定了struct的成员顺序这种办法就不行了。

论坛徽章:
0
5 [报告]
发表于 2007-12-20 11:13 |只看该作者
如果不想更改源代码的话,编译的时候加入-fpack-struct

论坛徽章:
0
6 [报告]
发表于 2007-12-20 11:20 |只看该作者
GCC编译时加入__attribute__ ((packed))
结构体将采用紧缩存储方式,整数采用网络字节顺序

论坛徽章:
0
7 [报告]
发表于 2007-12-20 11:29 |只看该作者
尽量不要这么搞,跨平台怎么办

论坛徽章:
0
8 [报告]
发表于 2007-12-20 11:41 |只看该作者
> 结构体前加个宏就可以了
这个不叫“宏”,叫编译指示。

论坛徽章:
0
9 [报告]
发表于 2007-12-25 16:48 |只看该作者
谢谢!还是使用伪指令#pragma pack比较好!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP