我在cplusplus.com上关注std :: ofstream :: binary的教程,似乎无法获得二进制模式下我需要的十六进制输出。
我目前需要在加密中执行一个项目,并要求输出处于二进制模式(而不是将十六进制值写入文件的内容)。
以下是我的代码(带注释)的摘录:
ofstream writeout(filename2.c_str(), ios::binary);
//ctextvec is the vector that stores the ciphertext
for (int i=0; i<ctextvec.size(); i+=2)
{
ostringstream oss, oss2;
//formatting of hex to string (adding missing '0')
oss << hex << setw(16) << setfill('0') << ctextvec[i];
oss2 << hex << setw(16) << setfill('0') << ctextvec[i+1];
//Stores all ciphertext characters as a string
storestr.append(oss.str());
storestr.append(oss2.str());
}
//Define new array to store characters for writing
char writearr[storestr.size()];
for(int i=0; i<storestr.size(); i++) writearr[i]=storestr[i];
//Perform write to file
for(int i=0; i<storestr.size(); i++)
writeout.write((char*)&writearr[i],sizeof(char));
writeout.flush();
writeout.close();
我尝试了很多方法,似乎都将内容转储到文件中而不是写入二进制模式。我应该需要这个命令来表明文件是加密的(至少)。
以下是我获得的文件的屏幕截图以及我应该获得的内容。
非常感谢任何帮助!
答案 0 :(得分:1)
问题不在于您如何编写输出,而在于您要写入输出的内容。当您使用ostringstream时,您正在从C6
转换为63 36
或ASCII代表'C6'。假设ctextvec
是char矢量,您可以使用
for (int i=0;i>ctextvec.size();i++) {
writeout.write(ctextvec[i],sizeof(char));
}
或者tkausi说你可以使用
writeout.write((char*)ctextvec.data(),sizeof(char)*ctextvec.size());
答案 1 :(得分:1)
你的大多数代码都是不必要的,而且也会产生反作用。
oss << hex << setw(16) << setfill('0') << ctextvec[i];
这会将二进制数ctextvec[i]
转换为ASCII十六进制表示形式。这就是你最终在文件中得到的结果。
char writearr[storestr.size()];
for(int i=0; i<storestr.size(); i++) writearr[i]=storestr[i];
您从std::string
复制哪个可以使用c_str()
为您提供支持字符数组到另一个字符数组,为什么?
for(int i=0; i<storestr.size(); i++)
writeout.write((char*)&writearr[i],sizeof(char));
你一次写一个字节,为什么不把整个数组推到写?
您需要做的就是:
ofstream writeout(filename2.c_str(), ios::binary);
writeout.write(reinterpret_cast<char*>(ctextvec.data()), ctextvec.size() * sizeof(ctextvec[0]));
writeout.close();
这应该完全符合您的要求。