C++ C++;如何将std::string格式的大整数转换为byte/char数组/向量

C++ C++;如何将std::string格式的大整数转换为byte/char数组/向量,c++,string,type-conversion,byte,biginteger,C++,String,Type Conversion,Byte,Biginteger,目前,我正在使用一个到目前为止似乎非常有用的 但我想将计算结果存储到一个二进制文件中,以供以后使用 出于某些原因(二进制模式、文件大小等),仅存储字符串不是一个选项 必须存储实际值,以便以后读取 我正在寻找的示例代码: BigInt example = BigInt("4"); std::vector<uint8_t> bytes = to_bytes(example); BigInt示例=BigInt(“4”); std::vector bytes=to_

目前,我正在使用一个到目前为止似乎非常有用的

但我想将计算结果存储到一个二进制文件中,以供以后使用

出于某些原因(二进制模式、文件大小等),仅存储字符串不是一个选项

必须存储实际值,以便以后读取

我正在寻找的示例代码:

BigInt example = BigInt("4");  
std::vector<uint8_t> bytes = to_bytes(example);
BigInt示例=BigInt(“4”);
std::vector bytes=to_字节(示例);
所需结果的示例:

“4”-->[0000 0100]//BigInt(“4”)
“255”-->[1111111]//BigInt(“256”)
“542”->[0000 0010][0001 1110]/…
“123456”->[0000 0001][1110 0010][0100 0000]
“高得离谱的数字”-->[?][?][?][?][?][?]]。。。[n字节]

当然,反过来也是:

std::vector<uint8_t> bytes = readbytes(file, n-bytes);//already have this  
BigInt result = from_bytes(bytes);
std::vector bytes=readbytes(文件,n字节)//已经有这个了
BigInt结果=从字节(字节);
所以基本上,我需要
to_bytes()
from_bytes()
函数

我正在使用C++20。

值都是积极的,但两种解决方案都受欢迎。

最好找到一个内置此功能的大整数库。该库甚至没有shift运算符支持。因此,您将不得不做一些可能非常慢的事情(特别是考虑到库),并且比它为您提供一个体面的界面要慢得多

要将如此大的整数转换为一系列字节,您必须逐个重复提取每个字节的数据。这里的“字节”是每28个数字一个。如果没有位移位运算符,它将涉及大量的除法和模运算

std::uint8_t extract_one_byte(BigInt &extract)
{
  auto intermediate = (extract % 256).to_int(); //Will always return a value on the range [0, 255]
  std::uint8_t the_byte = static_cast<std::uint8_t>(intermediate);
  extract /= 256;
  return the_byte;
}

std::vector<std::uint8_t> to_bytes(const BigInt &source)
{
  std::vector<std::uint8_t> ret;
  //ret.reserve(#); //pick a decent amount to reserve.
  BigInt curr = source;
  do
  {
    ret.push_back(extract_byte(curr));
  } while(curr != 0);

  return ret;
}

对于最多8个字节,您可以使用
std::stoi()
std::stol()
std::stoll()
将字符串格式的数字转换为二进制。要将二进制格式的数字转换为字符串,有
std::To_string()
。对于更高的字节计数,这就是事情变得棘手的地方,您必须开始手动解析字符串和操作二进制位。您真正需要的是base10到base2和base2到base10的转换。@RemyLebeau首先,感谢您提供的问题格式和快速回复评论。我看到库中使用了std::stoll函数,但只用于int、long、long数据类型。如果大于8字节,stol将抛出一个超出范围的异常。如果我没有弄错的话,我正在为大于8字节的情况寻找解决方案。我会怀疑一个没有内置此功能的BigInt库。@Eli:您想如何用二进制编码负数?2的补码是什么?@Nicol Bolas哦,是的,我用的是uint8。所以这里没有否定。谢谢,我不知道它是用字符串表示的,性能也是关键。你知道只有BigInt头的库吗?我想使用GMP,但我有一个编译噩梦和其他不应该发生的事情。或者你会推荐一个bigint库来进行此操作?我建议下一步尝试GMP。如果您在编译时遇到问题,请发布相关问题。
BigInt from_bytes(const std::vector<std::uint8_t> &le_bytes)
{
  BigInt ret = 0;
  for(auto curr_byte : le_bytes)
  {
    ret *= 256;
    ret += curr_byte;
  }

  return ret;
}