Supernetting 算法输出错误

问题描述 投票:0回答:1

我正在尝试实现一个功能,对给定的子网列表进行超级联网并返回最大可能的网络, 但它不能正常工作,问题是它返回的输出不正确, 该函数是由 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”,这是不正确的。

c++ networking
1个回答
0
投票

您必须简单地从最高位开始计算公共位的数量。这就是你的前缀,将不常见的位归零,常见位的数量就是前缀长度。

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 |
© www.soinside.com 2019 - 2024. All rights reserved.