C ++将char数组转换为int表示

时间:2011-11-08 20:53:34

标签: c++ math

将char数组(包含文件中的字节)转换为十进制表示形式的最佳方法是什么,以便以后可以将其转换回来?

例如“测试” - > 18951210 - > “测试”。

EDITED

6 个答案:

答案 0 :(得分:1)

我不确定你究竟是什么意思,但是字符作为“表示”存储在内存中,所以你不需要转换任何东西。如果你仍然想要,你必须更具体。

编辑:你可以

  • 尝试逐字节地移位结果,将结果向左移动8位并进行输入 用下一个字节。
  • 尝试使用mpz_inp_raw

答案 1 :(得分:1)

没有bignum类就无法完成,因为unsigned long long中的字母组合可能比整数组合更多。 (unsigned long long 保留约7-8个字符)

如果你有某种bignum类:

biguint string_to_biguint(const std::string& s) {
    biguint result(0);
    for(int i=0; i<s.length(); ++i) {
        result *= UCHAR_MAX;
        result += (unsigned char)s[i];
    }
    return result;
}
std::string biguint_to_string(const biguint u) {
    std::string result;
    do {
        result.append(u % UCHAR_MAX)
        u /= UCHAR_MAX;
    } while (u>0);
    return result;
}

注意:字符串到uint的转换将失去前导NULL,而字符串转换的uint将丢失尾随的NULL。

答案 2 :(得分:0)

您可以使用类似于Huffman压缩算法的树,然后将树中的路径表示为数字。

你必须将字典保存在某处,但你可以创建一个涵盖整个ASCII表的常量字典,因为压缩不是这里的目标。

答案 3 :(得分:0)

无需转换。你可以使用指针。

示例:

char array[4 * NUMBER];
int *pointer;

请注意pointer的“长度”为NUMBER

答案 4 :(得分:0)

如上所述,字符串已经是字节范围(因此很容易呈现为十进制数字)。将你的字节从000到255编号并将它们串在一起,你就得到了一个十进制数,无论价值多少。如果您确切地解释了为什么要使用十进制数,这将有所帮助,具体而言,因为十六进制会更容易。

如果您关心为Unicode字符串形成这些数字的基础数组的压缩,您可能会对以下内容感兴趣:

http://en.wikipedia.org/wiki/Standard_Compression_Scheme_for_Unicode

如果你想要一些压缩的好处,但仍希望在“打包”号码内进行快速随机访问读写,你可能会发现我的“NSTATE”库很有趣:

http://hostilefork.com/nstate/

例如,如果你只是想要一个只能提供26个英文字母的表示......你可以将“test”存储在:

NstateArray<26> myString (4);

您可以在不经过压缩或解压缩过程的情况下读取和写入字母,数字范围小于传统字符串。适用于任何基数。

答案 5 :(得分:0)

假设您要将整数(我在ascii代码中读取)存储在字符串中。这将添加您需要的前导零,以将其恢复为原始字符串。 character是一个最大值为255的字节,因此它需要三位数字形式的数字。它也可以很容易地在没有STL的情况下完成。但为什么不使用你拥有的工具?

#include <iostream>
#include <sstream>

using namespace std;

char array[] = "test";

int main()
{

   stringstream out;
   string s=array;   

   out.fill('0');
   out.width(3);
   for (int i = 0; i < s.size(); ++i)
   {
      out << (int)s[i];
   }
   cout << s << " -> " << out.str();
   return 0; 
}

输出:

test -> 116101115116

<强>加了:

将行更改为

out << (int)s[i] << ",";

输出

test -> 116,101,115,116,