Строковое представление C ++ IPv6 в boost :: multiprecision :: uint128_t - PullRequest
1 голос
/ 25 мая 2020

Мне нужно преобразовать строковый адрес IPv6 в boost :: multiprecision :: uint128_t Для IPv4 я использовал следующий алгоритм:

uint32_t byte1 = 0, byte2 = 0, byte3 = 0, byte4 = 0;
sscanf(ipAddress, "%3d.%3d.%3d.%3d", &byte1, &byte2, &byte3, &byte4);
uint32_t ip = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | (byte4);

Как я могу сделать это для IPv6?

1 Ответ

1 голос
/ 25 мая 2020

Используя пример из Википедии :

enter image description here

Также используется реализация address_v6 Boost Asio вместо 1970-х годов разбор:

Live On Coliru

#include <boost/asio/ip/address_v6.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <cstdio>

using boost::asio::ip::address_v6;
using boost::multiprecision::int128_t;

int main() {
    auto v6 = address_v6::from_string("2001:0DBB:AC10:FE01::");

    int128_t val {};
    for (uint8_t b : v6.to_bytes())
        (val <<= 8) |= b;

    std::cout << std::hex << std::showbase << val << std::endl;
}

Печать

0x20010dbbac10fe010000000000000000
...