C++ ofstream使用std::ios::binary模式写入文件仍为明文问题求助
问题排查与解决方案
核心问题:对std::ios::binary的作用理解有误
std::ios::binary仅用于关闭流的文本模式适配行为(例如Windows系统下换行符\n和\r\n的自动转换、特殊字符的转义处理),不会对写入的原始字节数据做任何编码、加密或者转换操作。你当前写入的就是原明文的ASCII字节,所以打开后自然还是明文内容,和是否加std::ios::binary无关。
实现“人类无法直接识别”的方案
如果需要输出内容不可直接阅读,需要对原始明文数据做转换处理,常见的轻量实现是对每个字节做固定密钥的异或运算,读取时用相同密钥再次异或即可还原原始数据。
代码优化与修改示例
原代码还存在可优化点:读写文件不需要逐字节循环,可直接用read()/write()方法批量操作二进制数据,同时要注意动态分配内存的释放避免泄漏。
#include <iostream> #include <fstream> #include <cstring> using namespace std; #define INFILE "test.txt" #define OUTFILE "binary-output.dat" // 自定义异或密钥,可随意修改 #define XOR_KEY 0x5A int main(int argc, char* argv[]) { char* text = nullptr; int nbytes = 0; // 打开文本文件 fstream input(INFILE, std::ios::in | std::ios::binary); if (!input) { throw "\n***Failed to open file " + string(INFILE) + " ***\n"; } // 获取文件大小 input.seekg(0, std::ios::end); nbytes = (int)input.tellg(); text = new char[nbytes]; // 批量读取文件内容 input.seekg(ios::beg); input.read(text, nbytes); input.close(); cout << "\n" << nbytes << " bytes copied from file " << INFILE << " into memory\n"; if (!text || nbytes == 0) { delete[] text; throw "\n***No data stored***\n"; } // 对数据做异或处理 for (int i = 0; i < nbytes; ++i) { text[i] ^= XOR_KEY; } // 写入二进制文件 ofstream _file; _file.open(OUTFILE, std::ios::binary); if (!_file.is_open()) { delete[] text; throw "\n***Failed to open file***\n"; } _file.write(text, nbytes); _file.close(); delete[] text; cout << "Encrypted binary data written to " << OUTFILE << "\n"; return 0; }
修改后的代码对所有明文字节做了异或处理,写入的二进制文件打开后会显示为乱码,需要读取时用相同的XOR_KEY再次异或每个字节即可还原原始明文。
内容的提问来源于stack exchange,提问作者P-DoxQuad
相关产品推荐
相关产品推荐

