我试图从Chip8版本的Pong中读取/打印出十六进制指令(可以下载here)。
这是我用来在ROM中读取的代码:
//Open ROM
string dir = "Test/PONG";
ifstream inf(dir.c_str(), ios::binary);
unsigned char input;
for(int i = 0; inf >> input; i++) {
//Each loop prints 1 bytes
//New line every 16 bytes and print line number
if(i%16 == 0) {
cout << endl;
cout << setw(7) << setfill('0') << i << " ";
}
//2 extra spaces after 8 bytes
else if(i%8 == 0)
cout << " ";
cout << hex << setw(2) << setfill('0') << (int)input << " ";
}
cout << endl;
这是输出的一部分:
0000000 6a 02 6b 6c 3f 6d a2 ea da b6 dc d6 6e 00 22 d4
0000010 66 03 68 02 60 60 f0 15 f0 07 30 00 12 1a c7 17
0000020 77 08 69 ff a2 f0 d6 71 a2 ea da b6 dc d6 60 01
...
这里的输出我认为是正确的,我从运行命令&#34; hexdump -C PONG&#34;在终端:
00000000 6a 02 6b 0c 6c 3f 6d 0c a2 ea da b6 dc d6 6e 00
00000010 22 d4 66 03 68 02 60 60 f0 15 f0 07 30 00 12 1a
00000020 c7 17 77 08 69 ff a2 f0 d6 71 a2 ea da b6 dc d6
...
在十六进制值的第一行,您可以看到值&#39; 0c&#39;终端两次,但代码输出跳过打印&#39; 0c&#39;。我不确定为什么我的代码会跳过&#39; 0c&#39;。我不正确地阅读文件了吗?是命令&#34; hexdump&#34;提供错误的输出?关于我阅读文件的方式,我可以改变什么?
编辑:使用inf.get(输入)能够读入&#39; 0c&#39;但是它也会以不同的方式输出一些十六进制值 例如:
6a 02 6b 0c 6c 3f 6d 0c ffffffa2 ffffffea ffffffda ffffffb6 ffffffdc ffffffd6 6e 00 22 ffffffd4 66 03 68 02 60 60 fffffff0
编辑2:打印&#f; f,因为某些十六进制值被读为负数。 所以我做了一个if语句来检查输入是否为负数,如果是负数我将它乘以-1然后打印十六进制值。 击>
编辑3:我决定使用字符串流只打印出最后2个字符的负十六进制值:
stringstream convert;
if((int)input < 0) {
convert << hex << (int)input;
cout << convert.str().substr(6,8) << " ";
convert.str("");
}
编辑4:十六进制&#39; 0c&#39;代表逃脱序列&#39; \ f&#39;因此在打印时会被忽略。使用inf.get(input)
代替inf >> input
将字符存储为输入为无格式字符(我认为)。但是get()
函数不能将unsigned char
作为参数。所以我必须将输入转换为char&
最后,我必须将inf >> input
更改为inf.get((char&)input)
。
答案 0 :(得分:1)
操作员及GT;&GT;从输入流中读取格式化数据(在您的情况下为char),因此值为12(十六进制为0c)的char被视为ASCII换行并被忽略(因为值为32或0x20将被视为空格)。 Char也是有符号值,并且十六进制值a2(十进制162)将存储为负值。将该值提升为int将保持符号并由于互补,当打印为未签名时,您将获得ffff。
保持
unsigned char input;
然后读取值使用
inf.get(static_cast<char>(input))
并打印
cout << hex << setw(2) << setfill('0') << static_cast<unsigned int>(input) << " ";
答案 1 :(得分:0)
您使用(signed) int
作为变量。当signed int
为负数并以十六进制打印时,前面会有一个或多个F
数字。
我强烈建议您使用unsigned int
作为您的值。