C++ 如何将字节数组转换为boost::multiprecision::uint128\t?
如果我有: 字符缓冲区[16] 如何将其原始字节转换为: boost::multiprecision::uint128\t 我试着做一个标准的C型演员: uint128\u t myInt=*uint128\u t*缓冲区 虽然它似乎不能正常工作。还尝试使用动态_cast 我找到了这个页面: 关于如何进行对话,但它似乎没有涵盖这类事情。有什么想法吗 编辑: 其中一条评论建议使用memcpy,如果它像GCC的128位uint一样,将字节复制到uint128\t中。如果按照我所期望的方式进行,这似乎无法正常工作:C++ 如何将字节数组转换为boost::multiprecision::uint128\t?,c++,boost,boost-multiprecision,C++,Boost,Boost Multiprecision,如果我有: 字符缓冲区[16] 如何将其原始字节转换为: boost::multiprecision::uint128\t 我试着做一个标准的C型演员: uint128\u t myInt=*uint128\u t*缓冲区 虽然它似乎不能正常工作。还尝试使用动态_cast 我找到了这个页面: 关于如何进行对话,但它似乎没有涵盖这类事情。有什么想法吗 编辑: 其中一条评论建议使用memcpy,如果它像GCC的128位uint一样,将字节复制到uint128\t中。如果按照我所期望的方式进行,这似乎
我遗漏了什么吗?我找到了一种基于uint128\t类型的动态特性的方法。它似乎没有在任何时候都使用所有16个字节作为数值。它只在认为需要它们时才使用它们,这就是原始memcpy无法工作的原因 因此,诀窍是迫使它认为所有16个字节都是必需的,然后将数据存储在内存中。我们可以通过将初始值设置为-1或所有Fs来实现:
boost::multiprecision::uint128_t getUintFromBuffer(const std::vector<unsigned char> &buf)
{
boost::multiprecision::uint128_t retU = -1;
memset(&retU, 0, 16);
memcpy(&retU, buf.data(), std::min(buf.size(), (size_t)16));
return retU;
}
int main()
{
std::vector<unsigned char> buf;
buf.resize(16);
buf[0] = 0xaa;
buf[15] = 0xff;
std::cout << std::hex << getUintFromBuffer(buf) << std::endl;
return EXIT_SUCCESS;
}
运行此示例将打印:
FF0000000000000000000000AA
这就是我想要的:我想说的可能就是你想要的:
#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
#include <iomanip>
#include <vector>
#include <iterator>
int main()
{
using boost::multiprecision::cpp_int;
// Create a cpp_int with just a couple of bits set:
cpp_int i;
bit_set(i, 5000); // set the 5000'th bit
bit_set(i, 200);
bit_set(i, 50);
// export into 8-bit unsigned values, most significant bit first:
std::vector<unsigned char> v;
export_bits(i, std::back_inserter(v), 8);
// import back again, and check for equality:
cpp_int j;
import_bits(j, v.begin(), v.end());
assert(i == j);
}
我发现仅仅使用boost::multiprecision::import_bits是有效的
这是OP提到的同一个链接,但不同的boost版本。
缓冲区的格式可能有帮助吗?这个想法就是字节缓冲区。所以可能是0xAA 0xBB 0xCC..如果它的行为类似于GCC的uint128\u t,那么您可以将缓冲区memcpy放入变量中。
template <unsigned Bits, boost::multiprecision::cpp_integer_type SignType,
boost::multiprecision::cpp_int_check_type Checked>
boost::multiprecision::number<
boost::multiprecision::cpp_int_backend<Bits, Bits, SignType, Checked, void>>
rawToBoost(const void *V) {
using namespace boost::multiprecision;
#if BOOST_ENDIAN_BIG_BYTE
static const auto msv_first = true;
#else
static const auto msv_first = false;
#endif
number<cpp_int_backend<Bits, Bits, SignType, Checked, void>> ret;
auto VPtr = reinterpret_cast<const unsigned char *>(V);
import_bits(ret, VPtr, VPtr + (Bits / 8), 0, msv_first);
return ret;
}
boost::multiprecision::int128_t rawToBoost_int128(const void *V) {
using namespace boost::multiprecision;
return rawToBoost<128, signed_magnitude, unchecked>(V);
}
boost::multiprecision::int128_t rawToBoost_int128_safe(const void *V) {
using namespace boost::multiprecision;
return rawToBoost<128, signed_magnitude, checked>(V);
}
boost::multiprecision::uint128_t rawToBoost_uint128(const void *V) {
using namespace boost::multiprecision;
return rawToBoost<128, unsigned_magnitude, unchecked>(V);
}
boost::multiprecision::uint128_t rawToBoost_uint128_safe(const void *V) {
using namespace boost::multiprecision;
return rawToBoost<128, unsigned_magnitude, checked>(V);
}