【发布时间】:2016-02-28 17:12:01
【问题描述】:
我正在尝试从 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
...
这是我在终端中运行命令“hexdump -C PONG”得到的我认为正确的输出:
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
...
在十六进制值的第一行,您可以在终端中看到两次值“0c”,但代码的输出会跳过打印“0c”。我不确定为什么我的代码会跳过“0c”。我是否不正确地阅读文件?命令“hexdump”是否提供了错误的输出?我可以改变我阅读文件的方式吗?
编辑:使用 inf.get(input) 能够读取 '0c' 但它也会以不同的方式输出一些十六进制值。
例如:
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',因为一些十六进制值被读取为负数。 所以我做了一个 if 语句来检查输入是否为负数,如果它是负数,我将它乘以 -1,然后打印十六进制值。
编辑 3:我决定使用字符串流仅打印出负十六进制值的最后 2 个字符:
stringstream convert;
if((int)input < 0) {
convert << hex << (int)input;
cout << convert.str().substr(6,8) << " ";
convert.str("");
}
编辑 4:十六进制 '0c' 表示转义序列 '\f',因此在打印时被忽略。使用 inf.get(input) 而不是 inf >> input 将字符作为未格式化的字符存储到输入中(我认为)。但是get() 函数不能将unsigned char 作为参数。所以我必须将输入转换为char&。
总之,我不得不将inf >> input 更改为inf.get((char&)input)。
【问题讨论】:
-
也许字符 0c 是换页的 ASCII 这一事实与您的输出有关
-
我也是这么想的,但是“08”代表退格,但是当从文件中读取“08”时,它仍然显示正确的输出。尽管在这种情况下您可能仍然是对的,但我问:如何强制打印“0c”?来源:en.wikipedia.org/wiki/…
-
你试过用 inf.get(input) 代替吗?
-
现在它似乎正在工作,虽然现在输出看起来像这样:6a 02 6b 0c 6c 3f 6d 0c ffffffa2 ffffffea ffffffda。它在一些十六进制值前添加了 6 'f'。
-
当您在 8 个字节后添加额外的空间时,似乎发生了一些事情。您是否以与发布的内容不同的方式编辑了该程序?
标签: c++ file-io hex emulation hexdump