将二进制文件读取到字符串但类型混合

时间:2015-05-29 14:01:30

标签: c file-io syntax binaryfiles

我正在尝试阅读二进制文件,但是当我读取它的字符时,它看起来并不像char类型的格式,所以例如数字不是'取而代之的是它们的ASCII值,它们的实际值却是字母确实有ASCII值。

为什么?

另外,当我创建一个二进制文件时,它不会保留所有'\0'填充,也不会保留每个数字后面的\x,这些是什么以及为什么会出现?< / p>

这就是我阅读文件的方式:

FILE * fp = fopen("file.bin", "rb");
char foo[20];
fread(foo, sizeof(char), 20, fp);

我在VS中可以看到,用这个填充foo

[0]: 5 '\x5'
[1]: 0 '\0'
[2]: 0 '\0'
[3]: 0 '\0'
[4]: 97 'a'
[5]: 66 'B'
[6]: 67 'C'
[7]: 100 'd'
[8]: 101 'e'
[9]: 6 '\x6'
[10]: 0 '\0'
[11]: 0 '\0'
[12]: 0 '\0'
[13]: 97 'a'
[14]: 97 'a'
[15]: 66 'B'
[16]: 84 'T'
[17]: 82 'R'
[18]: 121 'y'
[19]: 4 '\x4'

有没有办法读取所有字符,以便所有字符都保存ASCII值?有没有办法不读\0\x

1 个答案:

答案 0 :(得分:2)

正如@chux所说,VS向你显示的\x是VS向你呈现的char表示中不可分割的一部分。它试图通过提供一个可以直接在C源代码中用作char文字的表单来提供帮助。例如,

char c = '\x4';

它也(单独)给出每个char的数值(以十进制形式表示)。

  

为什么这些数字不具备ASCII值?

您自己说过:您正在阅读二进制文件。通常,这意味着数字以二进制形式表示,而不是格式化形式。

  

以及\ 0填充的内容是什么?

在您提供的数据中,数字与二进制形式一起使用。零值字节似乎不是填充,而是数字的4字节数字(小端)表示的部分。因此,数字6由四个字节表示,其值为6000

然而,根据数据的写入方式,可以在某些成员之间进行填充。处理诸如此类的问题是使用二进制数据格式的乐趣之一。要正确读取数据,您需要对其形式进行精确定义。