2017-09-09 4 views
0

J'ai suivi le tutoriel sur cplusplus.com pour std :: ofstream :: binary et je n'arrive pas à obtenir la sortie hexadécimale dont j'ai besoin en mode binaire.Impossible d'écrire un fichier en mode binaire même avec ios :: binary

Je dois actuellement faire un projet en cryptographie et exiger que la sortie soit en mode binaire (et ne pas écrire les valeurs hexadécimales dans le contenu du fichier).

Ci-dessous un extrait de mon code (avec commentaires):

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

J'ai essayé beaucoup de méthodes et tout semblait vider le contenu dans un fichier plutôt que d'écrire en mode binaire. J'ai supposément besoin de cette commande pour montrer qu'un fichier est crypté (au moins).

Voici les captures d'écran du fichier que j'ai obtenu et ce que je devrais obtenir.

Ce que je veux: Content dump

Ce que je suis censé faire: Supposed output

Toute aide est très appréciée!

+0

Vous pouvez simplement écrire 'ctextvec.data()', la majeure partie de votre code est inutile. – tkausl

Répondre

1

La plupart de votre code est inutile, pour-lop même contre-productif.

oss << hex << setw(16) << setfill('0') << ctextvec[i]; 

Ceci convertit le nombre binaire ctextvec[i] à une représentation ASCII hex. C'est ce que vous finissez avec dans votre dossier, finalement.

char writearr[storestr.size()]; 
for(int i=0; i<storestr.size(); i++) writearr[i]=storestr[i]; 

Vous copie d'un std::string qui peut vous donner le tableau de caractères de support en utilisant c_str() à un autre tableau de char, pourquoi?

for(int i=0; i<storestr.size(); i++) 
    writeout.write((char*)&writearr[i],sizeof(char)); 

Vous écrivez un octet à la fois, pourquoi ne pas simplement appuyer sur l'ensemble du tableau pour écrire?

Tout ce que vous devez faire est:

ofstream writeout(filename2.c_str(), ios::binary); 

writeout.write(reinterpret_cast<char*>(ctextvec.data()), ctextvec.size() * sizeof(ctextvec[0])); 

writeout.close(); 

Cela devrait faire exactement ce que vous voulez.

+0

Merci! Le code fonctionne mais l'ordre de la sortie prévue est inversé. Y a-t-il une méthode disponible pour cela? – Brandon

1

Le problème n'est pas lié à la façon dont vous écrivez la sortie mais à ce que vous écrivez en sortie. Lorsque vous utilisez le flux autrichien vous êtes en train de convertir de C6 à 63 36 ou la représentation ASCII de 'C6'. En supposant que ctextvec est un vecteur char, vous pouvez utiliser

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

ou tkausi dit que vous pouvez utiliser

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