C++ 将int写入二进制文件
我想将短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 我正在使用这个转换器:C++ 将int写入二进制文件,c++,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 我正在使用这个转换器: intmain(){ 流纹层
intmain(){
流纹层;
plik.open(“D:\\book.dat”,ios::binary);
如果(!plik.good())不能您的代码将正确地将该数字写入该文件,但您必须注意,在当今的大多数体系结构中,数字都存储在该文件中
也就是说,内存中的short int x=0xf0ff;
是0xff 0xf0
,而不是您可能期望的0xf0 0xff
如果您尝试使用十六进制编辑器打开文本文件,则文本文件实际上将包含0xff 0xf0
。
这相当于二进制中的11111111111000
(而不是111100001111111111
)
然后,您的文本编辑器将0xff 0xf0
解释为˙273;
现在,如果要在文件中写入1111 0000 1111 1111
,则必须“反向”写入数字或直接使用字符数组:
short int x=0xfff0
或char plik[]={0xf0,0xff};
请注意,并非所有体系结构都是little endian,因此,如果您关心可移植性,建议使用字符数组。您的代码将正确地将该数字写入该文件,但您必须注意,现在在大多数体系结构中,数字都存储在
也就是说,内存中的short int x=0xf0ff;
是0xff 0xf0
,而不是您可能期望的0xf0 0xff
如果您尝试使用十六进制编辑器打开文本文件,则文本文件实际上将包含0xff 0xf0
。
这相当于二进制中的11111111111000
(而不是111100001111111111
)
然后,您的文本编辑器将0xff 0xf0
解释为˙273;
现在,如果要在文件中写入1111 0000 1111 1111
,则必须“反向”写入数字或直接使用字符数组:
short int x=0xfff0
或char plik[]={0xf0,0xff};
请注意,并非所有体系结构都是little endian,因此,如果您关心可移植性,建议使用字符数组。您的代码将正确地将该数字写入该文件,但您必须注意,现在在大多数体系结构中,数字都存储在
也就是说,内存中的short int x=0xf0ff;
是0xff 0xf0
,而不是您可能期望的0xf0 0xff
如果您尝试使用十六进制编辑器打开文本文件,则文本文件实际上将包含0xff 0xf0
。
这相当于二进制中的11111111111000
(而不是111100001111111111
)
然后,您的文本编辑器将0xff 0xf0
解释为˙273;
现在,如果要在文件中写入1111 0000 1111 1111
,则必须“反向”写入数字或直接使用字符数组:
short int x=0xfff0
或char plik[]={0xf0,0xff};
请注意,并非所有体系结构都是little endian,因此,如果您关心可移植性,建议使用字符数组。您的代码将正确地将该数字写入该文件,但您必须注意,现在在大多数体系结构中,数字都存储在
也就是说,内存中的short int x=0xf0ff;
是0xff 0xf0
,而不是您可能期望的0xf0 0xff
如果您尝试使用十六进制编辑器打开文本文件,则文本文件实际上将包含0xff 0xf0
。
这相当于二进制中的11111111111000
(而不是111100001111111111
)
然后,您的文本编辑器将0xff 0xf0
解释为˙273;
现在,如果要在文件中写入1111 0000 1111 1111
,则必须“反向”写入数字或直接使用字符数组:
short int x=0xfff0
或char plik[]={0xf0,0xff};
请注意,并非所有体系结构都是little-endian,因此如果您关心可移植性,建议使用字符数组。您的代码可以。但是,使用记事本解释二进制数据却不行。简而言之,在使用记事本查看文件时,不应将Unicode值用于非ASCII字符(如đ)
记事本以8位编码读取文件,使用(可能是)在Windows区域和语言设置中配置的非Unicode程序的代码页
现在,在(我猜这是在您的语言环境中配置的)中,đ的代码为0xf0,˙的代码为0xff。因此,文件内容为0xff 0xf0,这正是您所期望的
我建议使用一些更高级的工具来检查二进制文件的内容。您的代码还可以。但是,使用记事本解释二进制数据却不行。简而言之,当使用记事本查看文件时,您不应该对非ASCII字符(如đ)使用Unicode值
记事本以8位编码读取文件,使用(可能是)在Windows区域和语言设置中配置的非Unicode程序的代码页
现在,在(我猜这是在您的语言环境中配置的)中,đ的代码为0xf0,˙的代码为0xff。因此,文件内容为0xff 0xf0,这正是您所期望的
我建议使用一些更高级的工具来检查二进制文件的内容。您的代码还可以。但是,使用记事本解释二进制数据却不行。简而言之,当使用记事本查看文件时,您不应该对非ASCII字符(如đ)使用Unicode值
记事本以8位编码读取您的文件,使用(大概)在Windows区域和Lan中配置的非Unicode程序的代码页
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;
}