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

Reading binary file to a string but the types are mixed

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

这是为什么?

此外,当我创建一个二进制文件时,它不包含所有这些 '[=13=]' 填充,也不包含每个数字后面的 \x,这些是什么,为什么会出现?

我是这样阅读文件的:

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

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

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

有没有办法读取所有字符,以便所有字符都保留 ASCII 值?有没有办法不读 [=16=]\x

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

char c = '\x4';

也是(分别)给你每个char的数值(以小数形式表示)。

How come the numbers don't have ASCII values though?

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

and what's with the [=21=] padding?

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

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