Ich versuche, eine Implementierung von RC4 zu schreiben. Ich lese im Klartext aus einer Datei mit einem ifstream. Ich bemerkte, dass es am Ende der Datei nicht ausgegeben wurde, also versuchte ich die verschiedenen Möglichkeiten, die Puffer explizit zu löschen. Egal, auf welche Weise (mit einem endl, anhängendes \ n, cout.flush() aufrufen) Ich versuche, den Puffer zu löschen, ich bekomme einen segfault. Als Plausibilitätsprüfung habe ich meinen Code durch ein Beispiel aus dem Internet ersetzt, das ich auch separat getestet habe. Es funktioniert, wenn ich es in eine eigene Datei lege und kompiliere (z. B. druckt es den Inhalt der Datei aus, segfault nicht und benötigt keine Aufrufe von flush() oder endl), aber nicht in meinem Code. HierProbleme mit Spülung cout nach dem Abrufen von Daten
ist das säumige Stück Code (was in Ordnung außerhalb meines Codes arbeitet, seine so ziemlich direkt von cplusplus.com kopiert)
ifstream is;
is.open("plain");
char c;
while (is.good()) // loop while extraction from file is possible
{
c = is.get(); // get character from file
if (is.good())
cout << c;
// cout.flush();
}
is.close(); // close file*/
Hier ist der vollständige Code: (Warnung, viele kommentierten out Code)
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
using namespace std;
static char s[256], k[256];
//static char *i, *j;
void swap(int m, int n, char t[256]){
char tmp = t[m];
t[m] = t[n];
t[n] = tmp;
}
char getByte(){
static char i(0), j(0);
i = (i+1)%256;
j = (j + s[i])%256;
swap(i, j, s);
return s[(s[i]+s[j]) % 256];
}
int main(int argc, char ** argv){
/*string key = argv[1];*/
if(argc < 4){
cout << "Usage: \n rc4 keyfile plaintextfile outputfile" << endl;
return -1;
}
string key;
ifstream keyfile (argv[1]);
keyfile >> k;
cout << "Key = " << k << endl;
keyfile.close();
/*ifstream plaintextf;
plaintextf.open(argv[2]);*/
ofstream ciphertextf (argv[3]);
for(int q = 0; q < 256; q++){
s[q] = q;
}
int i, j;
for(int m = 0; m < 256; m++){
j = (j + s[m] + k[m % sizeof(k)])%256;
swap(m, j, s);
}
// vector<char> bytes(plaintext.begin(), plaintext.end());
// bytes.push_back('\0');
// vector<char>::iterator it = bytes.begin();
/* char pt;
while(plaintextf.good()){
pt = plaintextf.get();
if(plaintextf.good()){
cout << pt;
ciphertextf <<(char) (pt^getByte());
}
} */
ifstream is;
is.open("plain");
char c;
while (is.good()) // loop while extraction from file is possible
{
c = is.get(); // get character from file
if (is.good())
cout << c;
// cout.flush();
}
is.close(); // close file*/
/*// plaintextf.close();
ciphertextf.close();
keyfile.close();
*/
return 0;
}
Sie fügen wahrscheinlich ein rohe '\ 0''-Zeichen in den Stream ein. Wirf das 'char' vor dem Einfügen in ein' int' und sieh nach, ob das funktioniert. – ildjarn
Gefällt mir? cout << (int) c; –
Weil das nicht geholfen hat ... Ich bin hier ziemlich ratlos. –