将二进制文件读入字符串但类型混合
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
由四个字节表示,具有值 6
、0
、0
、0
.
但是,根据数据的写入方式,某些成员之间可能 有填充。处理诸如此类的问题是使用二进制数据格式的乐趣之一。要正确读取数据,您需要精确定义其形式。
我正在尝试读取一个二进制文件,但是当我读取它的字符时,它看起来不像是用 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
由四个字节表示,具有值 6
、0
、0
、0
.
但是,根据数据的写入方式,某些成员之间可能 有填充。处理诸如此类的问题是使用二进制数据格式的乐趣之一。要正确读取数据,您需要精确定义其形式。