我正在编写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();
}
此函数编译并运行没有问题,但是,当我hexdump fileToWriteTo.img的内容时,结果是错误的。运行writeToBinaryFile(81)后的正确hexdump应为0000 0051,作为示例。
然而,ACTUAL hexdump是3030 3030,无论我传递给writeToBinaryFile()的整数是什么,它仍然存在。这种尝试将字符串写入二进制格式的文件时,我觉得我有一些相当微不足道的东西,但是目前对于正在发生的事情感到茫然。
答案 0 :(得分:2)
您意识到binaryString
是"00000000000000000000000001010001"
。
使用时
output.write(binaryString.c_str(), 4);
您正在编写字符串的前4个字符,这些字符都是'0'
个。可能让你困惑的是你期望看到数字为零,但你要求程序写的是字符'0'
。 '0'
的ASCII编码值为十进制48
,即0x30
。这就是您在文件中看到的内容 - 四个0x30
。
如果您想将数字写入二进制文件,您可以使用以下内容,而无需跳过bitset
箍。
void writeToBinaryFile(int number)
{
ofstream output("path/fileToWriteTo.img", ios::binary);
output.write(reinterpret_cast<char cons*>(&number), sizeof(number));
}
根本不需要函数中的其他行。