gpt4 book ai didi

c - 具有位域的结构的内存布局

转载 作者:太空狗 更新时间:2023-10-29 17:10:05 24 4
gpt4 key购买 nike

我有这个 C 结构:(代表一个 IP 数据报)

struct ip_dgram
{
unsigned int ver : 4;
unsigned int hlen : 4;
unsigned int stype : 8;
unsigned int tlen : 16;
unsigned int fid : 16;
unsigned int flags : 3;
unsigned int foff : 13;
unsigned int ttl : 8;
unsigned int pcol : 8;
unsigned int chksm : 16;
unsigned int src : 32;
unsigned int des : 32;
unsigned char opt[40];
};

我给它赋值,然后像这样用 16 位字打印它的内存布局:

//prints 16 bits at a time
void print_dgram(struct ip_dgram dgram)
{
unsigned short int* ptr = (unsigned short int*)&dgram;
int i,j;
//print only 10 words
for(i=0 ; i<10 ; i++)
{
for(j=15 ; j>=0 ; j--)
{
if( (*ptr) & (1<<j) ) printf("1");
else printf("0");
if(j%8==0)printf(" ");
}
ptr++;
printf("\n");
}
}

int main()
{
struct ip_dgram dgram;

dgram.ver = 4;
dgram.hlen = 5;
dgram.stype = 0;
dgram.tlen = 28;
dgram.fid = 1;
dgram.flags = 0;
dgram.foff = 0;
dgram.ttl = 4;
dgram.pcol = 17;
dgram.chksm = 0;
dgram.src = (unsigned int)htonl(inet_addr("10.12.14.5"));
dgram.des = (unsigned int)htonl(inet_addr("12.6.7.9"));

print_dgram(dgram);

return 0;
}

我得到这个输出:

00000000 01010100 
00000000 00011100
00000000 00000001
00000000 00000000
00010001 00000100
00000000 00000000
00001110 00000101
00001010 00001100
00000111 00001001
00001100 00000110

但我希望这样:

enter image description here

输出部分正确;在某处,字节和半字节似乎可以互换。这里有字节序问题吗?位域不适合这个目的吗?我真的不知道。有什么帮助吗?提前致谢!

最佳答案

不,位域不适用于此目的。布局取决于编译器。

在您想要控制结果布局的地方对数据使用位域通常不是一个好主意,除非您有(特定于编译器的)方法,例如 #pragma 来这样做。

最好的方法可能是在没有位域的情况下实现它,即自己进行所需的位运算。这很烦人,但比以某种方式挖掘解决此问题的方法要容易得多。此外,它与平台无关。

将 header 定义为 16 位字的数组,然后您就可以很容易地计算校验和。

关于c - 具有位域的结构的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15136426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com