我使用boost::multiprecision::uint128_t
类型来对128位值执行按位运算。但是,我无法将128位值写入二进制文件。特别需要用零填充值。
作为示例,如果uint128_t
值为0x123456
,那么在十六进制编辑器中查看文件,我会想要序列:
56 34 12 00 00 00 00 00 00 00 00 00 00 00 00 00
#include <boost/multiprecision/cpp_int.hpp>
#include <fstream>
boost::multiprecision::uint128_t temp = 0x123456;
std::ofstream ofile("test.bin", std::ios::binary);
ofile.write((char*)&temp, 16);
ofile.close();
而是二进制文件最终得到一个值:
56 34 12 00 CC CC CC CC CC CC CC CC CC CC CC
我可以看到uint128_t
模板的boost后端似乎将128位存储为4个32位值。并且有一个&#34;肢体&#34;值,表示正在使用的32位值。当32位值未使用时,它们将填充0xCCCCCCCC
。因此ofstream.write
正在遍历字符数组并写出0xC
。
我是否在boost库中缺少哪些东西来帮助正确地写出来,或者我是否需要将uint128_t
值转换为另一种数据类型?
答案 0 :(得分:0)
我潜入其中,你可以编写一个实用程序来将连续的肢体写为POD对象:
<强> Live On Coliru 强>
RDD
进制打印:
#include <boost/multiprecision/cpp_int.hpp>
#include <fstream>
template <typename BigInt, typename Backend = typename BigInt::backend_type>
void write_binary(std::ostream& os, BigInt const& number) {
static_assert(boost::is_pod<typename Backend::local_limb_type>::value, "not allowed");
os.write(
reinterpret_cast<char const*>(number.backend().limbs()),
number.backend().size()*sizeof(typename Backend::local_limb_type)
);
}
int main()
{
using uint128_t = boost::multiprecision::uint128_t;
std::ofstream ofs("binary.dat", std::ios::binary);
write_binary(ofs, uint128_t(42));
}
我担心这不可移植(可能取决于128位数字的编译器内在函数的可用性)。至少它的类型是安全的。