如何将ipv6地址从网络顺序转换为主机顺序
How to convert ipv6 address from network order to host order
比如说,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 位整数),我们将字节顺序转换为(使用 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 地址字节顺序转换的正确方法是什么?
您不需要,IPv6 地址未编码或处理为多字节整数,因此没有关于这些的 network/host 字节序的概念。 IPv6 地址只是一个 16 字节的序列。
So, if I consider ipv6 as u6_addr32[4]
不要那样做,通常没有理由 - 只需处理 __u8 u6_addr8[16];
比如说,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 位整数),我们将字节顺序转换为(使用 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 地址字节顺序转换的正确方法是什么?
您不需要,IPv6 地址未编码或处理为多字节整数,因此没有关于这些的 network/host 字节序的概念。 IPv6 地址只是一个 16 字节的序列。
So, if I consider ipv6 as u6_addr32[4]
不要那样做,通常没有理由 - 只需处理 __u8 u6_addr8[16];