将C ++ IPv6字符串表示形式转换为boost :: multiprecision :: uint128_t [英] C++ IPv6 string representation into boost::multiprecision::uint128_t

查看:50
本文介绍了将C ++ IPv6字符串表示形式转换为boost :: multiprecision :: uint128_t的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将IPv6字符串地址转换为boost :: multiprecision :: uint128_t对于IPv4,我使用以下算法:

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

对于IPv6,我该怎么做?

解决方案

使用

还使用Boost Asio的 address_v6 实现,而不是1970年代的解析:

在Coliru上直播

  #include< boost/asio/ip/address_v6.hpp>#include< boost/multiprecision/cpp_int.hpp>#include< cstdio>使用boost :: asio :: ip :: address_v6;使用boost :: multiprecision :: int128_t;int main(){自动v6 = address_v6 :: from_string("2001:0DBB:AC10:FE01 ::");int128_t val {};对于(uint8_t b:v6.to_bytes())(val<< = 8)| = b;std :: cout<<std :: hex<<std :: showbase<<val<<std :: endl;} 

打印

 <代码> 0x20010dbbac10fe010000000000000000 

I need to convert IPv6 string address into boost::multiprecision::uint128_t For IPv4 I used the following algorithm:

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);

How can I do like this for IPv6?

解决方案

Using the example from Wikipedia:

Also using Boost Asio's address_v6 implementation instead of a 1970-era parsing:

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;
}

Prints

0x20010dbbac10fe010000000000000000

这篇关于将C ++ IPv6字符串表示形式转换为boost :: multiprecision :: uint128_t的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆