将十进制转换为 ASCII
Posted
技术标签:
【中文标题】将十进制转换为 ASCII【英文标题】:Convert Decimal to ASCII 【发布时间】: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]) 【参考方案1】:如果你的字符串是空终止的,你不想这样做
10. while(temp[i]!=0)
代替
10. while(&temp[i]!=0)
虽然我不确定我是否理解 DataMemory 结构...
【讨论】:
当我删除 & 我得到一个段错误。我不是指针或任何东西的专家,所以我确定我在这里做错了什么。如果我不取消引用 temp,我不会检查数组的位置而不是内容吗? DataMemory 结构有点混乱。只需将其视为程序中不是指令的所有内容,包括堆栈、堆和静态数据。我将二进制文件的这些部分加载到我的 DataMemory 向量中。现在我的处理器可以访问所有需要的静态数据,并且可以放置结果。在稳定状态下,我的数据向量中只有一堆常量、文件名和地址,供稍后在处理器上运行的程序使用。 我认为也许我让问题看起来比实际更大。这是我想要做的: HEX(41424344) = DEC(1094861636) = ASCII('A','B','C','D') 我有 HEX 到 DEC 部分很好,但我可以不太清楚如何做第二部分。我已经尝试过使用 reinterpret_cast 来解决很多问题。这个问题有什么简单的解决方案吗? 我明白你的意思。但是,问题不是您取消引用 DataMemory(第18 行),然后将其转换为指向char 的pointer 吗?像 temp = reinterpret_cast抱歉,代码很乱。如果你想打印原始数据,那么你需要意识到nul-char实际上是零,这是原始数据中很常见的值。
因此,打印原始字符串很可能会提前结束,因为会找到一个 nul-char。
如前所述,测试可能应该是 while(temp[i] != 0)
而不是 while(&temp[i] != 0)
,因为任何内存位置(内核外部)的地址都是 != 0,这永远不会是错误的。
【讨论】:
没关系。这不是我的专长,所以任何帮助表示赞赏。我将按照之前的建议更改我的测试。此外,假设 MIPS ISA 将负责在正确的位置终止字符串。我想我坚持的主要部分是将单个元素中包含的十进制值转换为它的 ASCII 表示并将其插入某种可测试的数组中。这可能吗? 字符串(C 字符串 - char*)以第一个 nul-char 结尾。这就是标准定义。如果您有一个遵循 C/C++ 标准的编译器,他将以这种方式解释 C 字符串(实际上是编译器的工作,以使所有平台从代码的角度看起来都相同)。好吧,数据的 ASCII 表示,这不是很清楚。如果您想对可打印数据进行 ASCII 映射,则必须过滤掉不可打印的数据 - 参见ctype.h
(C 语言)/cctype
(C++ 语言)
我对“第一个 nul-char”的意思有点困惑。假设我的字符串是“abcd”,在我的向量中,它不会由 'a','b','c','d','/0' 表示吗?
从代码看来,您并不想只打印一些纯文本。它看起来像整数和其他原始数据。如果您只打印纯文本(文件名),那么我真的没有得到 DataMemory 变量(以及为什么要重新解释它)。也许您应该提供更多信息。
嗯,DataMemory 是我的 MIPS 处理器的内存。这意味着它不仅包含编译器生成的编译时间信息(比如说我们需要在程序中使用“PI”,所以在我的例子中,编译器会将这个常量放在寄存器(或向量元素)中。文件名也是如此。如果程序需要访问诸如 stdout 之类的文件,则文件名必须可用于 syscal 访问所述文件。编译器将在启动时将“stdout”放在 DataMemory 中。这意味着 DataMemory可以有[指令][常量][文件名][指令]以上是关于将十进制转换为 ASCII的主要内容,如果未能解决你的问题,请参考以下文章