如何将boost::asio::ip::address_v6 ip转换为2个uint64_t数字,并从2个uint 64
How to convert boost::asio::ip::address_v6 IP into 2 uint64_t numbers and back from 2 uint64_t to v6 address?
我首先通过以下操作将boost::asio::ip::address_v6
IP(比如1456:94ce:2567:a4ef:1356:94de:2967:a4e8
(转换为16字节的unsigned char
阵列:
auto ip = boost::asio::ip::address_v6::from_string("1456:94ce:2567:a4ef:1356:94de:2967:a4e8");
auto v6Bytes = ip.boost::asio::ip::address_v6::to_bytes();
现在,我的下一个目标是使用字节数组中的8个字节,并将它们转换为uint64_t
(假设我得到num1
(。类似地,使用数组中接下来的8个字节,我想生成另一个uint64_t
(比如num2
(。我可以在这里使用什么逻辑进行转换?
此外,一旦我得到num1
和num2
,我想使用它们并转换回
std::array<unsigned char, 16>
我在这里可以使用什么逻辑?
唯一支持的方法是使用std::memcpy
。将前八个字节复制到一个变量中,然后将其他八个字节拷贝到第二个变量中。
这可以很容易地通过&
运算符的地址和指针算法来实现:
std::uint64_t part1, part2;
std::memcpy(&part1, v6Bytes.data(), 8);
std::memcpy(&part2, v6Bytes.data() + 8, 8);
以相反的方式将数据复制回数组中。
我假设原始数组按网络字节顺序(bigendian(,并执行如下操作:
auto ip = boost::asio::ip::address_v6::from_string("1456:94ce:2567:a4ef:1356:94de:2967:a4e8");
auto v6Bytes = ip.boost::asio::ip::address_v6::to_bytes();
std::uint64_t num1;
std::uint64_t num2;
std::copy(std::begin(v6Bytes), std::begin(v6Bytes) + std::size(v6Bytes) / 2, (unsigned char*)&num1);
std::copy(std::begin(v6Bytes) + std::size(v6Bytes) / 2, std::end(v6Bytes), (unsigned char*)&num2);
// assume network byte order
boost::endian::big_to_native(num1);
boost::endian::big_to_native(num2);
// and back again
std::array<unsigned char, 16> bytes;
boost::endian::native_to_big(num1);
boost::endian::native_to_big(num2);
std::copy((unsigned char*)&num1, ((unsigned char*)&num1) + 8, bytes.data());
std::copy((unsigned char*)&num2, ((unsigned char*)&num2) + 8, bytes.data() + 8);
assert(bytes == v6Bytes);
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 处理多个异常集合的C++方法
- 什么时候在C++中返回常量引用是个好主意
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何将boost::asio::ip::address_v6 ip转换为2个uint64_t数字,并从2个uint 64
- 检查 IP 第一个八位字节是否不以 127 / 224 或 255 开头
- UDP客户端/服务器程序在不同的IP和端口上通信超过2个插座
- 我们如何从BOOST :: ASIO :: TCP :: ip :: read_some呼叫中顺序接收多个数据
- 唯一标识UDP连接-来自同一IP的多个连接
- 处理多个客户端的单个TCP/IP服务器(在c++中)
- 比较两个C语言字符串格式的IP地址
- Boost-asio监听单个(TCP)接收器上的多个IP地址
- 如何使用c++驱动程序连接两个客户端IP到相同的mongodb
- 一个线程可以连接多个套接字到相同的ip/端口吗?