如何将IP地址转换为数组?

时间:2020-07-30 08:02:15

标签: c++

我有

std::array<unsigned char, 4> ipv4 = {};

和IP地址90.100.160.101,如何将其添加到

peer.ipv4[0] = 90;
peer.ipv4[1] = 100;
peer.ipv4[2] = 160;
peer.ipv4[3] = 101;

3 个答案:

答案 0 :(得分:3)

这是问题的答案:将IP地址(以std::string的形式转换为std::array

我想添加这个答案,因为我认为“ Ihor Drachuk”的答案可以修改为使用更现代的C ++元素。

使用std::transform和超简单的正则表达式(\ d +),可以用一个语句替换所有这些代码行。

请参见以下示例:

#include <iostream>
#include <regex>
#include <array>
#include <algorithm>

// For easier reading and writing
using IPv4 = std::array<unsigned char, 4>;

// a regex for one or more digits
std::regex re{R"((\d+))"};

// Some test string. Can be anything
const std::string testIpString{"127.128.129.1"};

int main()
{
    // Here we will store the IP address as an array of bytes
    IPv4 ipV4{};
    
    // Convert IP-String to the array, using one statement. One liner
    std::transform(std::sregex_token_iterator(testIpString.begin(), testIpString.end(), re), {}, ipV4.begin(),
        [](const std::string& s){ return static_cast<unsigned char>(std::stoi(s));});
        
    // Some Debug output. Show result on screen    
    std::copy(ipV4.begin(), ipV4.end(), std::ostream_iterator<unsigned int>(std::cout,"\n"));

    return 0;
}

答案 1 :(得分:1)

我有

std::array<unsigned char, 4> ipv4 = {};

假设 ipv4 实际上包含您的地址(不说为什么吗?),而ipv4[0]是90,等等……

peer.ipv4[0] = ipv4[0];
peer.ipv4[1] = ipv4[1];
peer.ipv4[2] = ipv4[2];
peer.ipv4[3] = ipv4[3];

或使用循环

答案 2 :(得分:0)

如果您需要使用验证字符串将其解析为ipv4,可以尝试使用此功能

我认为这段代码应该比使用正则表达式或某些C ++功能要快,但是如果您不需要速度优化,最好用更少的代码,更清晰的答案来选择答案

using IPv4 = std::array<unsigned char, 4>;

// Speed-optimized variant
std::optional<IPv4> convertIPv4(const char* str)
{
    IPv4 result;
    size_t resultIndex = 0;

    const char* str2 = str;
    const char* ssEnd = nullptr;
    const char* ssStart = nullptr;

    int cnt = 0;

    while (true) {
        if (*str2 == '.' || *str2 == 0) {
            cnt++;

            if (!ssStart)
                return {};

            if (cnt == 5)
                return {};

            intptr_t diff = reinterpret_cast<intptr_t>(ssEnd) - reinterpret_cast<intptr_t>(ssStart);
            if ((diff < 0) || (diff > 2)) return {};

            if (diff == 2) {
                char c1 = *ssStart;
                char c2 = *(ssStart+1);
                char c3 = *(ssStart+2);

                if ((c1 < '0') || (c1 > '2')) return {};
                if ((c2 < '0') || (c3 < '0')) return {};
                if ((c2 > '9') || (c3 > '9')) return {};

                if (c1 == '2' && c2 >= '5' && c3 > '5') return {};

                result[resultIndex++] = (c1 - 48) * 100 + (c2 - 48) * 10 + (c3 - 48);
            } else if (diff == 1) {
                char c1 = *ssStart;
                char c2 = *(ssStart+1);

                if ((c1 < '0') || (c2 < '0')) return {};
                if ((c1 > '9') || (c2 > '9')) return {};

                result[resultIndex++] = (c1 - 48) * 10 + (c2 - 48);
            } else {
                char c1 = *ssStart;

                if ((c1 < '0') || (c1 > '9')) return {};

                result[resultIndex++] = c1 - 48;
            }

            // Return if all's done
            if (cnt == 4 && *str2 == 0) {
                return result;
            }

            ssEnd = nullptr;
            ssStart = nullptr;
        } else {
            if (!ssStart) ssStart = str2;
            ssEnd = str2;
        }

        str2++;
    }
}

用法:

IPv4 value = convertIPv4("127.0.0.1");
相关问题