将 int 写入二进制文件

Writing int to binary file

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

我想以这种形式将 short int x = 0x4740 写入二进制文件:0100 0000 0100 0111,当我在记事本中打开它时@G。它正在工作。当我尝试写例如 short int a = 0xf0ff 时;(二进制:1111 0000 1111 1111),记事本显示 ̇đ 这不是我的数字二进制(̇đ 是 1100 1011 1001 1001 1100 0100 1001 0001)。如何写入它并在此文件中获取 1111 0000 1111 1111

我使用此转换器:http://www.binaryhexconverter.com/binary-to-ascii-text-converter

int main() {
ofstream plik;
plik.open("D:\book.dat", ios::binary);
if (!plik.good()) cout << "error";
short int x = 0xf0ff;
plik.write(reinterpret_cast<char*>(&x), 2);
plik.close();
system("pause");
return 0;
}    

您的代码将正确地将该数字写入该文件,但您必须注意,在当今大多数体系结构中,数字都存储在Little Endian中。

也就是说,内存中的short int x = 0xf0ff;0xff 0xf0 ,而不是像您期望的那样0xf0 0xff

如果您尝试使用十六进制编辑器打开它,您的文本文件确实会包含0xff 0xf0。这相当于二进制(而不是1111 0000 1111 1111)中的1111 1111 1111 0000

然后,您的文本编辑器0xff 0xf0解释为˙đ


现在,如果要在文件中写入1111 0000 1111 1111,则必须"反向"写入数字或直接使用char数组:

short int x = 0xfff0char plik[] = {0xf0, 0xff};

请注意,并非所有架构都是小端序,因此如果您关心可移植性,建议使用 char 数组。

你的代码没问题。然而,使用记事本解释二进制数据则不是。简而言之,在使用记事本查看文件时,不应将 Unicode 值用于非 ASCII 字符(如 đ)。

记事本以 8 位编码读取文件,使用(大概)在 Windows 区域和语言设置中配置的非 Unicode 程序的代码页。

现在,在 windows-1250 中(我想这是在您的区域设置中配置的)đ 具有代码 0xf0,而 ̇ 具有代码0xff。因此,文件内容是0xff 0xf0的,这正是您所期望的。

我建议使用一些更高级的工具来检查二进制文件的内容。