struct iphdr中的__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD

本文探讨了在Linux的ip.h头文件中,struct iphdr结构体中使用__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD来处理字节序问题。当直接对ip首部的ihl或version成员赋值时,可能因不同字节序的机器(大端序或小端序)导致不同的行为。例如,memcpy操作可能会在大端序和小端序机器上产生不同的结果。为确保代码在两种字节序环境下的兼容性,需要根据机器字节序调整成员在内存中的布局。
摘要由CSDN通过智能技术生成

__LITTLE_ENDIAN_BITFIELD表示小端序,__BIG_ENDIAN_BITFIELD表示大端序。

/usr/include/linux/ip.h中有一段代码定义了ip首部的结构体,如下:

struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
	__u8	ihl:4,
		version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
	__u8	version:4,
  		ihl:4;
#else
#error	"Please fix <asm/byteorder.h>"
#endif
	__u8	tos;
	__be16	tot_len;
	__be16	id;
	__be16	frag_off;
	__u8	ttl;
	__u8	protocol;
	__sum16	check;
	__be32	saddr;
	__be32	daddr;
	/*The options start here. */
};

这里的:4是C语言中的位域,是指取二进制中的低四位(在大端序中这个低四位是存储在高地址的)。

如果使用者只允许直接对ihl或者version成员,那么这一段代码可以不用判断是大端序或者小端序。

但使用者可能使用memcpy来直接对这开头的8位进行赋值操作,而在大端序和小端序的机器上会产生不同的情况。

比如下面这段代码:

u_int16_t x = 0x1;
u_int8_t xx[2];
memcpy(xx, x);

在小端序的机器上结果应该是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值