将十进制转换为ASCII

时间:2010-06-14 15:15:10

标签: c++ string arrays pointers ascii

我在使用reinterpret_cast时遇到了困难。让我们直接说出我没有结婚的蝙蝠reinterpret_cast。随意提出重大变化。在我向您展示我的代码之前,我会告诉您我正在尝试做什么。

我正在尝试从我设计的MIPS I处理器使用的充满数据的向量中获取文件名。基本上我所做的是从我的处理器的测试程序中编译二进制文件,将二进制文件中的所有十六进制转储到我的c ++程序中的向量中,将所有这些十六进制转换为十进制整数并将它们存储在DataMemory向量中,这是数据我的处理器的内存单元。我也有指令记忆。因此,当我的处理器运行SYSCALL指令(如“打开文件”)时,我的C ++操作系统仿真器会在数据存储器中收到指向文件名开头的指针。所以请记住,数据存储器充满了整数,字符串,全局,本地,各种各样的东西。当我被告知文件名的起始位置时,我会执行以下操作:

将指向的整个十进制整数元素转换为其ASCII字符表示,然后从左向右搜索以查看字符串是否终止,如果没有则将每个字符连续加载到“filename”字符串中。执行此操作直到内存中的字符串终止,然后将文件名存储在表中。我的困难是从我的记忆中生成文件名。

以下是我正在尝试做的一个例子:

C ++语法(切换纯文本)

   1.Index Vector     NewVector   ASCII    filename
   2.0     240faef0   128123792   'abc7'   'a'
   3.0     240faef0   128123792   'abc7'   'ab'
   4.0     240faef0   128123792   'abc7'   'abc'
   5.0     240faef0   128123792   'abc7'   'abc7'
   6.1     1234567a   243225      'k2s0'   'abc7k'
   7.1     1234567a   243225      'k2s0'   'abc7k2'
   8.1     1234567a   243225      'k2s0'   'abc7k2s'
   9.            //EXIT LOOP//
  10.1     1234567a   243225      'k2s0'   'abc7k2s'

这是我到目前为止编写的代码来获取文件名(我只是将它应用于我的DataMemory向量的元素1000以测试功能.1000是任意的。): C ++语法(切换纯文本)

   1.int i = 0;
   2.int step = 1000;//top->a0;
   3.string filename;
   4.char *temp = reinterpret_cast<char*>( DataMemory[1000] );//convert to char
   5.cout << "a0:" << top->a0 << endl;//pointer supplied
   6.cout << "Data:" << DataMemory[top->a0] << endl;//my vector at pointed to location
   7.cout << "Data(1000):" << DataMemory[1000] << endl;//the element I'm testing
   8.cout << "Characters:" << &temp << endl;//my temporary char array
   9.
  10.while(&temp[i]!=0)
  11.{
  12.     filename+=temp[i];//add most recent non-terminated character to string
  13.     i++;
  14.     if(i==4)//when 4 characters have been added..
  15.     {
  16.          i=0;
  17.          step+=1;//restart loop at the next element in DataMemory
  18.          temp = reinterpret_cast<char*>( DataMemory[step] );
  19.     }
  20. }
  21. cout << "Filename:" << filename << endl;

所以问题是,当我将十进制元素转换为char数组时,我假设8个十六进制#将给我4个字符。为什么这不是这个案子?这是我的输出:

C ++语法(切换纯文本)

   1.a0:0
   2.Data:0
   3.Data(1000):4428576
   4.Characters:0x7fff5fbff128
   5.Segmentation fault

2 个答案:

答案 0 :(得分:0)

如果您的字符串以空值终止,那么您不想

10. while(temp[i]!=0)

的实例

10. while(&temp[i]!=0)

虽然不确定我理解DataMemory结构......

答案 1 :(得分:0)

抱歉,但代码很乱。如果要打印原始数据,则需要认识到nul-char实际上为零,这是原始数据中非常常见的值。

因此,打印原始字符串很可能会过早结束,因为会找到一个空字符。

如前所述,测试应该是while(temp[i] != 0)而不是while(&temp[i] != 0),它永远不会是假的,因为任何内存位置(内核之外)的地址都是!= 0。