mam napisany kod algorytmu Hilla. Wszystko działa pięknie, tylko problem jest z długością nieparzystą pliku. Po rozkodowaniu słowa np. informatyka jest dodatkowy znak, którego nie powinno być.
A dokładnie - mamy słowo informatyka --> kodujemy to słowo —> $÷!ň3&÷;Ç# —> rozkodujemy zakodowane słowo —> informatyka˙
Jak widzimy, mamy dodatkowy znak “˙”.
Tak szczerze nie miałem z tym do czynienia, więc nie wiem, jaki kod napisać.
Jak to w ogóle wygląda? Potrzebny będzie do tego char?
Jak wczytujesz cały plik (albo po kawałku) do bufora to możesz najpierw sprawdzić długość pliku i w zależności od parzystości wpisać odpowiednie bajty na początek bufora a do reszty wczytać plik.
Pseudolosowe liczby możesz uzyskać funkcją rand().
Nie widzę abyś wczytywał plik, jedynie je otwierasz
Jest to dosyć prosta rzecz, można to zrobić na wiele sposobów. Przykład z wczytywaniem całego pliku do bufora
#include
#include
#include
#include
using namespace std;
int main()
{
ifstream in("file.txt");
in.seekg(0, ios::end); //ustawienie wskaźnikia pliku na koniec
int size = in.tellg(); //pobranie pozycji wskaźnika pliku, ponieważ wskaźnik znajduje się teraz na końcu, więc jest to jednocześnie rozmiar pliku
in.seekg(0, ios::beg); //ustawienie wskaźnika pliku z powrotem na początek pliku
uint8_t* buff; //wskaźnik na bufor; uint8_t to liczba całkowita o rozmiarze 8 bitów (1 bajta), bez znaku, <0-255>
srand((unsigned)time(0)); //ustawienie początkowego ziarna generatora pseudolosowego na aktualny czas
if(size % 2 == 0) //jeśli rozmiar jest parzysty
{
size += 2; //nowy rozmiar jest większy o 2
buff = new uint8_t[size]; //alokacja bufora
buff[0] = 128 + rand() % 128; //wypełnienie pierwszych dwóch bajtów
buff[1] = rand() % 128;
in.read((char*)buff + 2, size - 2); //wczytanie pliku do reszty bufora
}
else //jeśli rozmiar jest nieparzysty
{
size += 1;
buff = new uint8_t[size];
buff[0] = rand() % 128;
in.read((char*)buff + 1, size - 1);
}
in.close();
// Dane są w buforze wskazywanym przez zmienną `buff` a rozmiar danych (łącznie z dopełnieniem) jest w zmiennej `size`.
// Możesz robić co chesz z tymi danymi, np. zapisać do pliku
ofstream out("file2.txt");
out.write((char*)buff, size);
out.close();
delete[] buff; //na koniec dobrze po sobie posprzątać ;)
return 0;
}