掩码的十六进制写法
程序与系统工具常把掩码表示成 32 位整数:每 8 位对应十进制掩码的一段,255 对应 FF,所以 /24 写作 0xFFFFFF00、/26 写作 0xFFFFFFC0。掌握末段的十六进制序列 80、C0、E0、F0、F8、FC、FE、FF,就能在读 ipset、iptables 与各类程序输出时直接换算,不必回退到十进制。
基本信息
| 换算基础 | 1 个十六进制位等于 4 个二进制位,2 位等于 1 个十进制段 |
|---|---|
| 整段值 | 255 对应 FF,128 对应 80,192 对应 C0 |
| 常见整掩码 | /8 是 0xFF000000,/16 是 0xFFFF0000,/24 是 0xFFFFFF00 |
| 末段序列 | 80、C0、E0、F0、F8、FC、FE、FF 依次对应 /25 到 /32 |
| 使用场合 | ipset、iptables 的 u32 匹配、程序内部掩码常量、路由平台导出的配置 |
末段十六进制对照
| 前缀 | 末段 HEX | 十进制 |
|---|---|---|
| /24 | 00 | 0 |
| /25 | 80 | 128 |
| /26 | C0 | 192 |
| /27 | E0 | 224 |
| /28 | F0 | 240 |
| /29 | F8 | 248 |
| /30 | FC | 252 |
| /31 | FE | 254 |
| /32 | FF | 255 |
常见掩码的十六进制
常见掩码的十六进制
/8 0xFF000000
/12 0xFFF00000
/16 0xFFFF0000
/20 0xFFFFF000
/24 0xFFFFFF00
/26 0xFFFFFFC0
/28 0xFFFFFFF0
/30 0xFFFFFFFC
/32 0xFFFFFFFF程序验证
程序验证
import ipaddress
print(int(ipaddress.ip_network('0.0.0.0/26').netmask) == 0xFFFFFFC0) # True
for p in (24, 25, 26, 27, 28, 29, 30, 31, 32):
print(p, hex(int(ipaddress.ip_network(f'0.0.0.0/{p}').netmask)))典型使用场景
- 读 ipset 或 nftables 导出的规则,看到 C0 立刻能判定是 /26 范围
- 写程序做地址匹配时用掩码常量代替硬编码十进制,可读性与可移植性更好
- 核对设备导出的配置,把十六进制掩码还原成前缀长度后与规划表比对
- 调试内核模块或抓包工具的偏移量过滤,掩码以十六进制表达最自然
- 跨平台搬迁时统一按十六进制核对掩码,避免各系统十进制表达差异导致的误读
换算与自查
- 拿到十六进制掩码先数位数:8 个十六进制位才是完整掩码,位数不足说明写错了
- 从高位往低位数为 1 的二进制位个数,就是前缀长度,例如 F0 是 4 个 1,对应末段 4 位
- 掩码十六进制必然是一串连续的 1 后面跟一串 0,出现 0 与 1 交替说明该值不是合法掩码
- 核对通配符时要记住它是掩码的按位取反:掩码 F0 对应通配符 0F
记忆技巧:末段每加一位前缀,就相当于把当前值右移一位再补 1。80 右移补 1 得 C0,C0 右移补 1 得 E0,依次类推,序列不会记错。
整掩码的十六进制有规律可循:/8 之后每 4 位前缀对应一个十六进制位由 0 变 F,记住 F0 对应 4 位、FF 对应 8 位,中间值可以按位推算。