将char数组中的数字字符转换为二进制数

时间:2014-04-11 00:08:06

标签: c++ binary char

char *toBin(unsigned long long num)
{
  char s[9999];
  const int size= 9999;
  char *temp = new char[size];
  int i, j;
  int binBase = 2;

  for(i=0; num!= 0; i++)
  {
      s[i] = num % binBase + '0';
      num /= binBase;
  }//get backwards binary

  for(j=0; i>=0; j++)
  {
      i--;
      temp[j]=s[i];
  }//reverse binary sequence

  //increments one more so need to decrement
  temp[--j] = '\0';
  return temp;
  delete temp;
}

如果我在char数组中有“82”,我首先将“82”转换为小数82,并将82转换为上述函数以转换为二进制。这仅适用于某个数字限制。

我认为我的问题是unsigned long long只能保存一定数量的数字,所以当超过该限制时,会向函数发送一些随机内容,这会打印出错误的二进制文件。

上面的函数将unsigned long long num转换为binary。我意识到更好的方法是查看char数组中的每个字符,而不是先将其转换为数字,然后使用这些值转换为二进制。但是,我很难将其用于代码。任何建议或帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

  • 在堆栈上分配9999 char的数组是不明智的,因为它可能对您的平台来说太大了。无论如何,您可以轻松计算所需的最大位数(+终结符):CHAR_BIT*sizeof num+1
  • 此外,无需在堆上分配相等的金额。
  • 不要害怕指针:
    • 初始化指向最后一个字节的指针
    • 将其设为零
    • 添加以最小值开头的所有数字(至少一个,即使数字为0)。
    • 返回已完成号码的副本。

答案 1 :(得分:0)

GNU Multiple Precision(GMP)库具有在任何基础上打印任何大小编号的功能。以下是一个例子。

#include <iostream>
#include <gmpxx>

int main()
{
    std::string numstr = "1234123412341234123412341234";

    // initialize mpz_class to have numstr in it (given in base 10)
    mpz_class bigint(numstr, 10);

    // convert to binary (base 2)
    std::string binstr = bigint.get_str(2);

    std::cout << numstr << " -> " << binstr << std::endl;
    return 0;
}

程序输出

1234123412341234123412341234 -> 111111110011010111110011000011110100100000101001110100011000000101000011000000000111110010