将C ++ IPv6字符串表示形式转换为boost :: multiprecision :: uint128_t [英] C++ IPv6 string representation into boost::multiprecision::uint128_t
本文介绍了将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年代的解析:
#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:
#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屋!
查看全文