如何更改位字段的存储或如何更改位字段的排列

时间:2018-12-31 05:52:34

标签: c bit-fields

我正在编写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位是版本,然后是协议类型,然后是备用,依此类推)

0 个答案:

没有答案