【发布时间】:2010-06-14 15:15:09
【问题描述】:
我在使用 reinterpret_cast 时遇到了困难。让我们直接说我没有结婚 ot reinterpret_cast。随意提出重大改变。在我向你展示我的代码之前,我会让你知道我想要做什么。
我正在尝试从我设计的 MIPS I 处理器正在使用的充满数据的向量中获取文件名。基本上我所做的是从我的处理器的测试程序中编译一个二进制文件,将二进制文件中的所有十六进制转储到我的 c++ 程序中的向量中,将所有这些十六进制转换为十进制整数并将它们存储在作为数据的 DataMemory 向量中我的处理器的内存单元。我也有指令记忆。因此,当我的处理器运行诸如“打开文件”之类的 SYSCALL 指令时,我的 C++ 操作系统仿真器会收到一个指向数据存储器中文件名开头的指针。所以请记住,数据内存充满了整数、字符串、全局变量、局部变量,以及各种各样的东西。当我被告知文件名从哪里开始时,我会执行以下操作:
将指向的整个十进制整数元素转换为其 ASCII 字符表示,然后从左到右搜索字符串是否终止,如果没有,则将每个字符连续加载到“文件名”字符串中。这样做直到字符串在内存中终止,然后将文件名存储在表中。我的困难是从我的记忆中生成文件名。
这是我正在尝试做的一个示例:
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 位十六进制单词,然后在每个 2 位段上转换为 ascii,然后将结果附加到我的文件名字符串,迭代直到我得到一个“0”并中断。尽管以笨拙的方式工作得很好。 转换 = hexCharValue(tempInstructionMemory[1000][i*2])
标签: c++ string arrays pointers ascii