比方说,ipv6被定义为:
struct in6_addr
{
union
{
__u8 u6_addr8[16];
__be16 u6_addr16[8];
__be32 u6_addr32[4];
} in6_u;
#define s6_addr in6_u.u6_addr8
#define s6_addr16 in6_u.u6_addr16
#define s6_addr32 in6_u.u6_addr32
};对于ipv4 (32位整数),我们将endianess转换为(使用htonl()):
Little endian: 0x0A0B0C0D
Big endian : 0x0D0C0B0A我正在从网络中解析一个数据包。那么,如果我认为ipv6是u6_addr32[4],那么下面是正确的吗?
u32_nw_order[0] = inet_ntop(u32_host_order[3])
u32_nw_order[1] = inet_ntop(u32_host_order[2])
u32_nw_order[2] = inet_ntop(u32_host_order[1])
u32_nw_order[3] = inet_ntop(u32_host_order[0])如何正确地处理128位IPv6地址的endianness转换?
发布于 2018-12-06 16:37:24
您不需要这样做,IPv6将arn作为多字节整数进行编码或处理,因此不存在网络/主机端的概念。一个IPv6地址只是一个16个字节的序列。
所以,如果我认为ipv6是u6_addr324
不要那样做,通常是没有理由的-只需要处理__u8 u6_addr8[16];
https://stackoverflow.com/questions/53655800
复制相似问题