我正在尝试实现一个功能,对给定的子网列表进行超级联网并返回最大可能的网络, 但它不能正常工作,问题是它返回的输出不正确, 该函数是由 Ai 生成的,我尝试对其进行了很多修改,但无法修复它,Ai :)
这是我尝试过的功能的最终更新:
QStringList IPSupernetting::calculateSupernet(const QStringList& subnets) {
uint32_t commonPrefix = 0xFFFFFFFF;
int maxPrefixLength = 0;
for (const QString& subnet : subnets) {
QStringList parts = subnet.split('/');
if (parts.size() != 2) continue;
QString networkAddress = parts[0];
int prefixLength = parts[1].toInt();
QHostAddress address(networkAddress);
if (address.isNull() || address.protocol() != QAbstractSocket::IPv4Protocol)
continue;
quint32 ipv4Address = address.toIPv4Address();
quint32 mask = 0xFFFFFFFF << (32 - prefixLength);
commonPrefix &= (ipv4Address & mask);
maxPrefixLength = std::max(maxPrefixLength, prefixLength);
}
QString supernet = QHostAddress(commonPrefix).toString() + "/" + QString::number(maxPrefixLength);
QStringList result;
result.append(supernet);
return result;
}
为了测试该函数,在主函数中,我将此列表传递给函数,然后循环遍历它:
IPSupernetting inv;
QStringList subnets = {
"192.168.0.0/24",
"10.0.0.0/16",
"172.16.0.0/20",
"192.0.2.0/24",
"10.10.10.0/24"
};
foreach (QString subnet, inv.calculateSupernet(subnets)) {
qDebug() << "Calculated Supernet:" << subnet;
};
它输出:“0.0.0.0/24”,这是不正确的。
您必须简单地从最高位开始计算公共位的数量。这就是你的前缀,将不常见的位归零,常见位的数量就是前缀长度。
192.168.0.0/24 = 110000001010100000000 00000000000
192.168.1.0/24 = 110000001010100000000 00100000000
192.168.2.0/24 = 110000001010100000000 01000000000
192.168.3.0/24 = 110000001010100000000 01100000000
192.168.4.0/24 = 110000001010100000000 10000000000
| 21 Common Bits | Uncommon |
结果是:
110000001010100000000 00000000000 = 192.168.0.0/21
| 21 Common Bits | Zero Bits |