C++如何将uint256类型大数字符串转换为vector<unsigned char>
uint256十进制字符串转32字节vector实现方案
方案1:无第三方依赖手动实现
思路:逐位处理十进制字符串,模拟十进制转256进制的过程,直接生成目标字节数组,无需引入任何外部库。
实现代码:
#include <vector> #include <string> std::vector<unsigned char> uint256_str_to_vec(const std::string& dec_str) { // 初始化32字节全0的vector,默认大端序存储 std::vector<unsigned char> res(32, 0); for (char c : dec_str) { int digit = c - '0'; // 现有值整体乘10 uint16_t carry = 0; for (int i = 31; i >= 0; --i) { uint16_t tmp = res[i] * 10 + carry; res[i] = tmp & 0xFF; carry = tmp >> 8; } // 加上当前位的数字 carry = digit; for (int i = 31; i >= 0 && carry; --i) { uint16_t tmp = res[i] + carry; res[i] = tmp & 0xFF; carry = tmp >> 8; } // 输入符合uint256范围,carry最终一定为0无需额外处理 } return res; }
该实现默认输出大端序字节数组,和0xffffff...fff的字面量字节顺序完全一致。如果需要小端序,反转返回的vector即可。
方案2:使用Boost.Multiprecision实现
你尝试使用的256位无符号整型类型可以直接通过字符串构造,无需复杂转换,再通过库自带的export_bits接口导出字节即可。
实现代码:
#include <vector> #include <string> #include <boost/multiprecision/cpp_int.hpp> using uint256_t = boost::multiprecision::number< boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void> >; std::vector<unsigned char> uint256_str_to_vec(const std::string& dec_str) { uint256_t num(dec_str); // 直接通过十进制字符串构造256位无符号数 std::vector<unsigned char> res; res.reserve(32); // 第四个参数为false表示导出大端序,true为小端序 boost::multiprecision::export_bits(num, std::back_inserter(res), 8, false); // 不足32字节时前面补0,保证总长度为32 if (res.size() < 32) { res.insert(res.begin(), 32 - res.size(), 0); } return res; }
注意事项
- 两种方案输出的vector大小固定为32字节,符合要求,输入为uint256最大值时得到的就是32个
0xff的数组。 - 如果业务需要压缩前导0,只需要在返回前遍历数组,去掉开头的连续0即可,最终大小不会超过32字节。
内容的提问来源于stack exchange,提问作者Jocelyn
相关产品推荐
相关产品推荐

