将 int 写入二进制文件
Writing int to binary file
我想以这种形式将 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 = 0xfff0
或char plik[] = {0xf0, 0xff};
请注意,并非所有架构都是小端序,因此如果您关心可移植性,建议使用 char 数组。
你的代码没问题。然而,使用记事本解释二进制数据则不是。简而言之,在使用记事本查看文件时,不应将 Unicode 值用于非 ASCII 字符(如 đ)。
记事本以 8 位编码读取文件,使用(大概)在 Windows 区域和语言设置中配置的非 Unicode 程序的代码页。
现在,在 windows-1250 中(我想这是在您的区域设置中配置的)đ 具有代码 0xf0,而 ̇ 具有代码0xff。因此,文件内容是0xff 0xf0的,这正是您所期望的。
我建议使用一些更高级的工具来检查二进制文件的内容。
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 无法一次从二进制文件中读取一个 int
- 使用 c++ 时从二进制文件中读取 int 不正确
- C 二进制文件 - 编写INT-奇怪的行为
- 有没有一种优雅的方法来读取二进制文件并将其内容复制到向量<int>
- 将简短的int保存在二进制文件中而不是文本文件中
- 读取包含未签名INT的文件,然后将其写入C 中的二进制文件
- 将 int 的二进制文件读取到字符串 c++
- 编写/读取二进制字节/int/longs to/trom to/trom c 中的文件流
- 将 int 写入二进制文件
- 如何在C++中将二进制文件上下文转换为 int/long 值
- "Right" C++ 中从大端二进制文件中检索 int 的方法
- 正在从二进制文件中读取双值和int值
- visual在C++中读取和写入int到二进制文件
- 我正在创建一个二进制文件,在其中插入一对int类型和一个结构,并看到下面给出的错误.请提出建议