二进制文件应该是什么样的?

How does binary file should look like?

本文关键字:什么样 二进制文件      更新时间:2023-10-16

我是编程初学者,我有一个问题。我想写一个结构体到我的二进制文件中。我对结果也不确定。结构如下:

struct clientData
{
    unsigned int id;
    char name[25];
    char post[15];
    char degree[10];
    clientData(unsigned int, char*, char*, char*);
};

如您所见,我的结构包含一些字符串。主要问题是:我的字符串是否应该在最终的二进制文件中重新转换(因此它们对于记事本等应用程序不可读)?因为我的结果看起来是这样的(我不能添加图像,所以我只粘贴它):

英里EdgecombeМММММММММ讲解员ММММММММpew1МММММММ

我是这样写二进制文件的:

ofstream binary_1st("binary_input.dat", ios::out | ios::binary);
...
binary_1st.write((char*) &cl, sizeof(clientData));
...
binary_1st.close();

您正在向文件原样写入结构,而不需要任何序列化或打包。因此,结构将按原样编写,字符串将是可读的(如果它们在代码中是可读的),数字将是数字,等等。

顺便说一句,这个M在 里
Miles Edgecombe МММММММММdocent ММММММММpew1 МММММММ

意味着你的结构中的字符数组在向它们写入字符串之前不归零,因此末尾没有尾随零,因此'thrash'将在末尾写入。

我的字符串应该在最终的二进制文件中重新转换吗不可读的应用程序,如记事本等)?因为我的结果看起来像这样(我不能添加图像,所以我就粘贴它):

别担心这个。字符串可能不包含换行符。任何将二进制转换为文本格式的代码都应该担心Notepad &c.

您可能不应该发明自己的二进制格式。但是,如果你真的必须这样做,那么请注意以下内容。

  • 确保包含版本信息。
  • 明确数据大小,可能用固定32位或64位大小的东西替换int
  • 以字节为单位存储整数,使其具有固定的端对端。见http://linux.die.net/man/3/htons。
  • 使用固定字符串编码。utf - 8。
  • 确保你知道你的字符串如何终止。要么在它们前面粘贴一个大小,要么在字符串后面写一个NUL字节(您的示例代码都没有)。

update:我刚刚注意到我的答案可能对初学者来说不是很清楚,但我不想把它写成一篇文章。主要的一点是,逐字存储结构体可能不是一个好主意。