2013-03-27 13 views
5

Używając prostego funktor nazwie EncryptorDeszyfrowanie XOR-zaszyfrowany plik przerywa przedwcześnie

struct Encryptor { 
    char m_bKey; 
    Encryptor(char bKey) : m_bKey(bKey) {} 
    char operator()(char bInput) { 
     return bInput^m_bKey++; 
    } 
}; 

mogę zaszyfrować dany plik łatwo

std::ifstream input("in.plain.txt", std::ios::binary); 
std::ofstream output("out.encrypted.txt", std::ios::binary); 
std::transform(
    std::istreambuf_iterator<char>(input), 
    std::istreambuf_iterator<char>(), 
    std::ostreambuf_iterator<char>(output), 
    Encryptor(0x2a)); 

jednak starając się przywrócić to poprzez wywołanie

std::ifstream input2("out.encrypted.txt", std::ios::binary); 
std::ofstream output2("out.decrypted.txt", std::ios::binary); 
std::transform(
    std::istreambuf_iterator<char>(input2), 
    std::istreambuf_iterator<char>(), 
    std::ostreambuf_iterator<char>(output2), 
    Encryptor(0x2a)); 

działa tylko częściowo. Oto rozmiary plików:

in.plain.txt:  7,700 bytes 
out.encrypted.txt: 7,700 bytes 
out.decrypted.txt: 4,096 bytes 

W tym przypadku wydaje się, że metoda działa tylko dla pierwszych 2**12 bajtów i chyba tylko dla wielokrotności go (to może być mój rozmiar bloku systemu plików?). Dlaczego mam to zachowanie i jakie jest tego obejście?

+0

wygląda na to, że tak się nie dzieje, gdy próbuję to odtworzyć. – moooeeeep

+0

@moooeeeep: Kto wie, jak kompilator C++ Microsoftu "optymalizuje się" w porównaniu do gcc lub clang? Zakładam, że ten błąd nie wystąpiłby, gdyby przenieść dwa bloki en/deszyfrowanie pomiędzy '{/*...*/}' do własnego zakresu tak, że strumienie zostaną automatycznie zamknięte. –

Odpowiedz

4

Utwórz podany kod źródłowy, wygląda na to, że strumień wyjściowy nie jest zamknięty przed próbą odczytania go z dysku. Ponieważ istnieje bufor wyjściowy w klasie nadrzędnej, może to oznaczać, że twoje dane nadal znajdują się w buforze, a zatem nie są przepłukiwane na dysk. Zamknięcie strumienia wyjściowego przed odczytaniem go z dysku powinno rozwiązać problem.

+0

To nie odpowiada na pytanie w aktualnej formie i powinno być komentarzem. –

+0

@ RichardJ.RossIII: To nie odpowiada na pytanie, ale Ale jest całkowicie poprawne! To był właśnie powód, dla którego nie otrzymałem odpowiedniego wyniku. –

+0

OK! Będę edytować nieco odpowiedź, aby była bardziej przejrzysta/wyraźna. – Ale

Powiązane problemy