如何在 C++ 中将大字符串数字 (uint256) 转换为 vector<unsigned char>

How to convert a large string number (uint256) into vector<unsigned char> in C++

我有一个字符串编号在uint256之间,比如"115792089237316195423570985008687907853269984665640564039457584007913129639935"。我想将这个数字的字节存储到一个 vector<unsigned char> 中。也就是说,我想将 0xffffff...fff (256bit) 存储在 vector 中,其中 vector 的大小不会大于 32 字节。

我试过以下方法:

  1. 使用int接收字符串号码并转账,但号码不在int范围内;

  2. 使用 boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>。但我不知道如何将字符串编号转换为这种类型。我在网上找不到使用这种类型的详细信息。

这个基于 Boost.Multiprecision 的解决方案对我很有效:

std::string input { "115792089237316195423570985008687907853269984665640564039457584007913129639935" };

boost::multiprecision::uint256_t i { input };

std::stringstream ss;
ss << std::hex << i;
std::string s = ss.str();
std::cout << s << std::endl;

std::vector<unsigned char> v{s.begin(), s.end()};    

它打印:

ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

是您要找的吗?

现场演示:https://godbolt.org/z/cW1hf61Wf

编辑

我最初可能误解了这个问题。如果你想让vector包含那个数的二进制表示(也就是把那个数序列化成一个vector),也是可以的,甚至更简单:

std::string input{ "115792089237316195423570985008687907853269984665640564039457584007913129639935" };
boost::multiprecision::uint256_t i { input };
    
std::vector<unsigned char> v;
export_bits(i, std::back_inserter(v), 8);

现场演示:https://godbolt.org/z/c1GvfndG9

对应文档:https://www.boost.org/doc/libs/1_65_0/libs/multiprecision/doc/html/boost_multiprecision/tut/import_export.html.