我有
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;
答案 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");