Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

04.09.2009, 14:41

Datei wird nicht vollständig eingelesen

Hi Leute,
ich wollte mir vor einigen Wochen einen eigenen Cryptor schreiben.
Jetzt bin ich so weit, dass die Dateien eingelesen und verschlüsselt werden sollen. Das verschlüsseln klappt auch, aber wenn ich keine .bmp oder .txt Datei nehme, wird die Datei nciht vollständig eingelesen. Es werden immer nur die ersten paar Bytes eingelesen. Ich habe mir den Code der Funktion schon zig mal angesehen, konnte aber nichts finden. Vielleicht findet ihr ja was.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Variablen

    std::ifstream fOrginalFile;
    std::ofstream fNewFile;
    sHeader Header;

    // Als erstes Parameter prüfen

    // Existiert die Datei?

    fOrginalFile.open(sFile.c_str());
    if(fOrginalFile == NULL)
    {
        fOrginalFile.close();
        return FILE_ERROR;
    }

    // Password prüfen

    if(sPassword == "")
        return WRONG_PASSWORD;

    // Die Orginal Datei einlesen, verschlüssseln und abspeichern

    // Die Endung der Datei herausfinden

    std::string sType = sFileName;
    int ipos = sType.find(".");
    sType.erase(0, ipos);

    // Pfad der neuen Datei zusammen basteln

    // Wenn die Datei schon existiert, überschreiben

    std::string stemp = sNewFile;
    if(sNewFile.find(".crypt") == -1)
    {
        stemp += sType;
        stemp += ".crypt";
    }

    fNewFile.open(stemp.c_str());
    if(fNewFile == NULL)
    {
        fNewFile.close();
        return FILE_ERROR;
    }
    
    // Header erstellen

    int iChecksume = 12;
    Header.iCryptVersion = 290809;
    if(CryptValue((char*) &iChecksume, sPassword))
        Header.iChecksume = iChecksume;
    else
        return UNKNOWN_ERROR;

    // Header in die Datei schreiben

    fNewFile.write((char*) &Header, sizeof(Header));

    // Und nun die eigentliche Datei verschlüsseln 

    while(!fOrginalFile.eof())
    {
        // Wert einlesen

        char Buffer;
        fOrginalFile.read((char*) &Buffer, sizeof(Buffer));

        // Und verschlüsselt abspeichern

        if(CryptValue(&Buffer, sPassword))
            fNewFile.write((char*) &Buffer, sizeof(Buffer));
        else
        {
            fNewFile.close();
            fOrginalFile.close();
            return UNKNOWN_ERROR;
        }
    }

    // Alles wieder schließen

    fNewFile.close();
    fOrginalFile.close();

    // Wenn die Orginal Datei gelöscht werde soll, löschen

    if(bDelete == true)
    {
        // Erst noch überschreiben, damit man sie nicht wiederherstellen kann

        FILE * fFile;
        fFile = fopen(sFile.c_str(), "w+");
        fclose(fFile);
        remove(sFile.c_str());
    }

    return OK;

Wie immer bedanke ich mich für Hilfe schon mal im Voraus.[/cpp]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

04.09.2009, 14:54

Das Problem hatte ich auch mal und ich hab mir damals die Seele aus dem Leib debugged weil der Fehler so subtil war dass ich ihn einfach die ganze Zeit nicht gesehen hab^^

Also: Du öffnest die Datei nicht binär sondern im Textmodus, was dazu führt dass z.B. (unter Windows) die Bytesequenz '\r\n' in '\n' umgewandelt wird, was bei ner Binärdatei natürlich alles kaputtmacht sobald in der Datei mal zufällig so eine Sequenz daherkommt...

3

04.09.2009, 14:58

Stimmt was für ein Fehler...
Danke, jetzt geht es.

Werbeanzeige