代码之家  ›  专栏  ›  技术社区  ›  Brandon

即使使用ios::binary,也无法以二进制模式写入文件

  •  0
  • Brandon  · 技术社区  · 8 年前

    以下是我的代码摘录(附注释):

    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();
    

    我尝试了很多方法,似乎都是将内容转储到文件中,而不是写入二进制模式。我应该需要这个命令来显示文件是加密的(至少)。

    下面是我得到的文件截图和我应该得到的。

    Content dump

    我应该得到: Supposed output

    非常感谢您的帮助!

    2 回复  |  直到 8 年前
        1
  •  1
  •   tkausl    8 年前

    大部分代码都是不必要的,lop甚至会适得其反。

    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();
    

        2
  •  1
  •   Samuel    8 年前

    问题不在于如何写入输出,而在于向输出写入什么。当您使用正在转换的ostringstream时 C6 63 36 或“C6”的ASCII表示。假设 ctextvec

    for (int i=0;i>ctextvec.size();i++) {
        writeout.write(ctextvec[i],sizeof(char));
    }
    

    或者正如tkausi所说,你可以使用

    writeout.write((char*)ctextvec.data(),sizeof(char)*ctextvec.size());