running test

测试文章:Hello World!
这是一篇测试文章,内容包含简单的“Hello World!”表述。

Hello World!
测试文章~

你遇到的错误是: ``` lua: temp1.lua:121: assertion failed! ``` 这说明在测试用例中有一项断言失败了。我们来定位具体是哪一行出错,并修复这个测试用例。 --- ### 🔍 定位错误 根据你的输出,前 7 个测试组都通过了,问题出在第 8 个测试组: ```lua test("掩码长度合法性测试", function() assert(subnet_is_in("192.168.0.0/32", "192.168.0.0/31") == false) assert(subnet_is_in("192.168.0.0/31", "192.168.0.0/30") == false) assert(subnet_is_in("192.168.0.0/2", "0.0.0.0/0") == true) end) ``` 最后一行: ```lua assert(subnet_is_in("192.168.0.0/2", "0.0.0.0/0") == true) ``` 这行报错说明实际返回了 `false`,而期望是 `true`。 --- ### 🧠 问题分析 `0.0.0.0/0` 是默认路由,表示整个 IPv4 地址空间,任何 CIDR 都应该被它包含。 但 `192.168.0.0/2` 是一个非常大的子网(前缀长度为 2),其网络范围是: - 网络地址:`0.0.0.0`(因为 `/2` 掩码是 `192.0.0.0`,前两位为 0) - 广播地址:`64.0.0.0 - 1 = 63.255.255.255` 而 `0.0.0.0/0` 的网络地址是 `0.0.0.0`,广播地址是 `255.255.255.255`。 所以 `192.168.0.0/2` 的广播地址是 `63.255.255.255`,确实应该被 `0.0.0.0/0` 包含。 --- ### ✅ 修复函数逻辑 我们来检查 `parse_cidr` 函数中的掩码计算是否正确。问题可能出在掩码构造方式上。 #### 🛠 修复 `parse_cidr` 函数如下: ```lua local function parse_cidr(cidr) local ip_str, prefix = cidr:match("([^/]+)/?(.*)") local prefix_len = prefix == "" and 32 or tonumber(prefix) local ip_num = ip_to_number(ip_str) -- 正确构造掩码:前 prefix_len 位为 1,其余为 0 local mask = (0xFFFFFFFF << (32 - prefix_len)) & 0xFFFFFFFF local network = ip_num & mask local broadcast = network | (~mask & 0xFFFFFFFF) return network, broadcast end ``` > 注意:我们使用了 Lua 中的位移和按位运算符,这在 Lua 5.3+ 是支持的。如果你使用的是 **Lua 5.1**,需要使用 `bit.lshift`, `bit.bor`, `bit.band`, `bit.bnot`(来自 `bit` 库)。 --- ### ✅ 修复后的测试用例(Lua 5.3+) ```lua test("掩码长度合法性测试", function() assert(subnet_is_in("192.168.0.0/32", "192.168.0.0/31") == false) assert(subnet_is_in("192.168.0.0/31", "192.168.0.0/30") == false) assert(subnet_is_in("192.168.0.0/2", "0.0.0.0/0") == true) end) ``` --- ### ✅ Lua 5.1 专用修复(使用 bit 库) 如果你使用的是 **Lua 5.1**,你需要安装 `bit` 库(如 `bit32`),并修改 `parse_cidr` 如下: ```lua local bit = require("bit") local function parse_cidr(cidr) local ip_str, prefix = cidr:match("([^/]+)/?(.*)") local prefix_len = prefix == "" and 32 or tonumber(prefix) local ip_num = ip_to_number(ip_str) -- 使用 bit 库进行位运算 local mask = bit.band(bit.lshift(0xFFFFFFFF, 32 - prefix_len), 0xFFFFFFFF) local network = bit.band(ip_num, mask) local broadcast = bit.bor(network, bit.band(0xFFFFFFFF, bit.lshift(1, 32 - prefix_len) - 1)) return network, broadcast end ``` --- ### ✅ 总结 - 你遇到的错误是因为 `192.168.0.0/2` 的广播地址未正确计算。 - 修复方式是确保掩码构造正确,广播地址为 `network | (~mask)`。 - 如果使用 Lua 5.1,请使用 `bit` 库进行位运算。 --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值