将int写入二进制文件

时间:2015-01-11 14:51:30

标签: c++

我想以这种形式将短的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;
}    

2 个答案:

答案 0 :(得分:2)

您的代码会正确地将该数字写入该文件,但您必须注意,现在大多数架构上的数字都存储在Little Endian中。

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

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

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


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

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

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

答案 1 :(得分:1)

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

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

现在,在windows-1250中(我想这是在你的语言环境中配置的)đ有代码0xf0,而˙有代码0xff。所以文件内容是0xff 0xf0,这正是你所期望的。

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