根据掩码位计算IPv6地址掩码

您所在的位置:网站首页 ipv6是如何表示的 根据掩码位计算IPv6地址掩码

根据掩码位计算IPv6地址掩码

#根据掩码位计算IPv6地址掩码| 来源: 网络整理| 查看: 265

最近想一个问题如何快速判断IPv6地址是否为同网段?

比如给定一个前缀prefix 和一个掩码位数mask_len, 那么一个IPv6地址与前缀怎么对比比较快呢。

我大概想了一下,把mask_len变成mask, (IPv6 & mask) ^ prefix == 0 ? 这种位操作的判断应该是比较快的。

mask_len变成mask就要麻烦一点了,毕竟IPv6有16个字节,不像IPv4可以直接位移4字节的unsigned int那么简单。

经过一番调试(经历了分批位移失败的教训后),写出了如下代码,终于还是单字节操作比较方便。

#include #include typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64; typedef union { u8 as_u8[16]; u16 as_u16[8]; u32 as_u32[4]; u64 as_u64[2]; } ip6_address_t; #define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c" #define BYTE_TO_BINARY(byte) \ (byte & 0x80 ? '1' : '0'), \ (byte & 0x40 ? '1' : '0'), \ (byte & 0x20 ? '1' : '0'), \ (byte & 0x10 ? '1' : '0'), \ (byte & 0x08 ? '1' : '0'), \ (byte & 0x04 ? '1' : '0'), \ (byte & 0x02 ? '1' : '0'), \ (byte & 0x01 ? '1' : '0') int print_ip6(ip6_address_t* ip) { int i = 0; for (i = 0; i < 16; i++) { printf(" "BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(ip->as_u8[i])); if (i == 7) { printf(" "); } } printf("\n"); return 0; } int cal_bitmask(ip6_address_t* p, int len) { if (len < 0) { return -1; } int i = 0; p->as_u64[0] = 0; p->as_u64[1] = 0; for (i = 0; i < 16 && len > 0; i++) { if (len < 8) { p->as_u8[i] = 0xFF as_u8[i] = 0xFF; len -= 8; } return 0; } int main() { ip6_address_t mask; memset(&mask, 0, sizeof(mask)); int i = 0; for (i = 0; i


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3