我正在编写GTPV1 U头,为此我声明了一个具有一些位字段的结构。该位字段的存储方式引起了问题,所以我想知道什么可能的解决方案。
试图搜索位字段的存储方式以及系统如何对待它们,但是没有得到我可以应用于我的代码的任何方法
以下是结构定义
typedef struct __attribute__((__packed__)) GTPv1Uheader{
UInt8 version :3;
UInt8 ProtocolTypeFlag :1;
UInt8 Spare :1;
UInt8 ExtensionFlag :1;
UInt8 SequenceNumberFLAG :1;
UInt8 NpduNumberFlag :1;
} GTPv1UheaderT;
这里所有位字段都存储为字节
分配数据
GTPGTPv1UheaderT *GTPv1UheaderP
GTPv1UheaderP= malloc (sizeof(GTPv1UheaderT));
memset(GTPv1UheaderP,0,sizeof(GTPv1UheaderT));
GTPv1UheaderP->version = 0x1;
GTPv1UheaderP->ProtocolTypeFlag = 0x1;
GTPv1UheaderP->Spare = 0x0;
GTPv1UheaderP->ExtensionFlag = 0x0;
GTPv1UheaderP->SequenceNumberFLAG = 0x1;
GTPv1UheaderP->NpduNumberFlag = 0x0;
unsigned char *p=(unsigned char *)GTPv1UheaderP;
for(int i=0;i<(sizeof(GTPv1UheaderT));i++){
printf("%02X ",p[i]);
}
预期结果:32(0011 0010)
(从左到右的前3位是版本,下1位是ProtocolType标志,下一个是备用,依此类推。)
实际结果:49(0100 1001)
(从右到左,最后3位是版本,然后是协议类型,然后是备用,依此类推)