在HEX中打印:程序添加额外的0xFF

时间:2015-09-23 18:05:33

标签: c binaryfiles fread

我试图一次读取两个字节的二进制文件并显示结果。我想出了以下内容:

int main() {
    char opcode[2];
    FILE *fp;

    fp = fopen("games/PONG", "rb");

    while( fread(opcode, 1, 2, fp) != 0 ) {
        printf(" %02X%02X\n", opcode[0], opcode[1]);
    }
}

有点有效:

$ ./c8disas
 6A02
 6B0C
 6C3F
 6D0C
 FFFFFFA2FFFFFFEA
 FFFFFFDAFFFFFFB6
 FFFFFFDCFFFFFFD6
 6E00
 ...

输出中的某些行包含额外的FF个字节,我不知道它们来自哪里。

作为参考,这是我阅读的二进制文件:

$ hexdump -C games/PONG
00000000  6a 02 6b 0c 6c 3f 6d 0c  a2 ea da b6 dc d6 6e 00  |j.k.l?m.......n.|
00000010  22 d4 66 03 68 02 60 60  f0 15 f0 07 30 00 12 1a  |".f.h.``....0...|
00000020  c7 17 77 08 69 ff a2 f0  d6 71 a2 ea da b6 dc d6  |..w.i....q......|
00000030  60 01 e0 a1 7b fe 60 04  e0 a1 7b 02 60 1f 8b 02  |`...{.`...{.`...|
00000040  da b6 60 0c e0 a1 7d fe  60 0d e0 a1 7d 02 60 1f  |..`...}.`...}.`.|
...

2 个答案:

答案 0 :(得分:3)

默认情况下,

char通常是有符号整数。因此,高阶位在传递给int之前被扩展为printf()时进行符号扩展。请改用unsigned char

你也可以和(&0xff去除其他位,但你真的应该在这里使用无符号值。

答案 1 :(得分:2)

FF来自负位(我知道%X应该是无符号的)。尝试:

printf(" %02X%02X\n", 0xFF & opcode[0], 0xFF & opcode[1]);