将二进制数写入文件时出现意外结果 [C++]
Unexpected Result When Writing Binary Number To File [C++]
我正在 Linux 中编写一个应该非常简单的函数,它接受一个整数,将其转换为 4 字节二进制字符串,并将其写入二进制文件。
函数:
void writeToBinaryFile(int number){
remove("path/fileToWriteTo.img"); //remove outdated version of file
ofstream output("path/fileToWriteTo.img", ios::binary);
string binaryString = bitset<32>(number).to_string();
cout << "BINARY DATA IS " << binaryString << endl;
//This looks perfect, an example entry of 81 results in an output of
//BINARY DATA IS 00000000000000000000000001010001
output.seekp(0);
output.write(binaryString.c_str(), 4); //write these 4 bytes into binary file
output.close();
}
这个函数编译运行没有问题,但是,当我对fileToWriteTo.img的内容进行hexdump时,结果是错误的。例如,运行 writeToBinaryFile(81) 之后正确的 hexdump 应该是 0000 0051。
但是,实际 hexdump 是 3030 3030,无论我将什么整数传递给 writeToBinaryFile(),它都保持不变。我觉得在尝试以二进制格式将字符串写入文件时遗漏了一些相当微不足道的东西,但目前我对发生的事情一头雾水。
你意识到 binaryString
是 "00000000000000000000000001010001"
。
当你使用
output.write(binaryString.c_str(), 4);
你写的是字符串的前4个字符,都是'0'
。可能让您感到困惑的是,您希望看到数字零,但您要求程序写入的是字符 '0'
。 '0'
的ASCII编码值为十进制的48
,即0x30
。这就是您在文件中看到的内容 -- 四个 0x30
s.
如果你想以二进制形式将数字写入文件,你可以使用下面的代码,而无需跳过 bitset
圈。
void writeToBinaryFile(int number)
{
ofstream output("path/fileToWriteTo.img", ios::binary);
output.write(reinterpret_cast<char cons*>(&number), sizeof(number));
}
您根本不需要函数中的其他行。
我正在 Linux 中编写一个应该非常简单的函数,它接受一个整数,将其转换为 4 字节二进制字符串,并将其写入二进制文件。
函数:
void writeToBinaryFile(int number){
remove("path/fileToWriteTo.img"); //remove outdated version of file
ofstream output("path/fileToWriteTo.img", ios::binary);
string binaryString = bitset<32>(number).to_string();
cout << "BINARY DATA IS " << binaryString << endl;
//This looks perfect, an example entry of 81 results in an output of
//BINARY DATA IS 00000000000000000000000001010001
output.seekp(0);
output.write(binaryString.c_str(), 4); //write these 4 bytes into binary file
output.close();
}
这个函数编译运行没有问题,但是,当我对fileToWriteTo.img的内容进行hexdump时,结果是错误的。例如,运行 writeToBinaryFile(81) 之后正确的 hexdump 应该是 0000 0051。
但是,实际 hexdump 是 3030 3030,无论我将什么整数传递给 writeToBinaryFile(),它都保持不变。我觉得在尝试以二进制格式将字符串写入文件时遗漏了一些相当微不足道的东西,但目前我对发生的事情一头雾水。
你意识到 binaryString
是 "00000000000000000000000001010001"
。
当你使用
output.write(binaryString.c_str(), 4);
你写的是字符串的前4个字符,都是'0'
。可能让您感到困惑的是,您希望看到数字零,但您要求程序写入的是字符 '0'
。 '0'
的ASCII编码值为十进制的48
,即0x30
。这就是您在文件中看到的内容 -- 四个 0x30
s.
如果你想以二进制形式将数字写入文件,你可以使用下面的代码,而无需跳过 bitset
圈。
void writeToBinaryFile(int number)
{
ofstream output("path/fileToWriteTo.img", ios::binary);
output.write(reinterpret_cast<char cons*>(&number), sizeof(number));
}
您根本不需要函数中的其他行。