【问题标题】:How to convert a large string number (uint256) into vector<unsigned char> in C++如何在 C++ 中将大字符串数(uint256)转换为向量<unsigned char>
【发布时间】:2022-01-09 16:04:47
【问题描述】:

我有一个范围为uint256的字符串编号,比如"115792089237316195423570985008687907853269984665640564039457584007913129639935"。我想将此数字的字节存储到vector&lt;unsigned char&gt; 中。也就是说,我想将0xffffff...fff(256bit)存储在vector中,其中vector的大小不会大于32字节。

我尝试了以下方法:

  1. 使用int接收字符串号码并进行转帐,但号码超出int范围;

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

【问题讨论】:

  • 一种可能的解决方案可能是首先将长十进制数转换为相应的十六进制值,仍然作为字符串。一旦您在字符串中获得了十六进制表示,就很容易将每两个数字转换为字节大小的整数值以存储在向量中。
  • 您只需从字符串构造提升数字,或使用 >> 进行流式传输。
  • @Someprogrammerdude 但是,在将十进制字符串数字转换为十六进制字符串数字的过程中,必须需要一个大整数类型来接收十进制字符串进行转换。然后又回到最初的问题。
  • @n.1.8e9-where's-my-sharem 您能否在答案中详细说明?

标签: c++ boost bignum


【解决方案1】:

这个基于 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

编辑

我最初可能误解了这个问题。如果您希望向量包含该数字的二进制表示(即将该数字序列化为向量),也是可能的,甚至更容易:

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

【讨论】:

  • 如果 OP 想要导出这些位,可以使用 export_bits
  • @dratenik 谢谢,我相应地更新了问题。
  • @DanielLangr 非常感谢!您的解决方案完美解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2020-10-11
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
相关资源
最近更新 更多