Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- napisac program ktory wykonuje kodowanie lub dekodowanie zawartosci jednego pliku przy pomocy klucza zapisanego w drugim pliku (2.5p)
- Kod:
- koduj [-d] pklucz plik
- domyslnie program wykonuje kodowanie pliku, a z opcja -d dekodowanie pliku wejsciowego. w obydwu przypadkach nowa zawartosc zastepuje stara zawartosc pliku wejsciowego. klucz do kodowania zapisany jest w postaci ciagu znakow w jednej linii pliku pklucz (nie uwzgledniac znaku konca linii i znaku konca pliku). kolejne znaki klucza (pobierane cyklicznie) sluza do zakodowania kolejnych znakow pliku wejsciowego, przy czym kod ASCII znaku klucza dodawany jest do kodu ASCII kodowanego znaku. odkodowanie znaku nastepuje w wyniku odjecia kodu ASCII znaku klucza. wykorzystac mmap().
- Kod:
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/mman.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <errno.h>
- #include <fcntl.h>
- int main(int argc, char *argv[])
- {
- char *dane, *klucz;
- int fd, i, koduj = 0, r_klucz;
- struct stat iwezel;
- if(argc < 3)
- {
- perror("uzycie: koduj [-d] pklucz plik\n");
- return 1;
- }
- //sprawdzamy czy dekodujemy czy kodujemy
- if(strcmp(argv[1], "-d") == 0) koduj = 1;
- //odczytywanie klucza
- if((fd = open(argv[1+koduj], O_RDONLY)) == -1)
- {
- perror("blad otwarcia pliku klucza\n");
- return 2;
- }
- if(fstat(fd, &iwezel))
- {
- perror("blad fstat\n");
- return 3;
- }
- //rozmiar klucza, byc moze trzeba zmniejszyc jezeli ma nie uwzgledniac znaku konca linii
- r_klucz = iwezel.st_size;
- if((klucz = mmap(NULL, iwezel.st_size, PROT_READ, MAP_SHARED, fd, 0)) == (void*)-1)
- {
- perror("blad mmap\n");
- return 4;
- }
- close(fd);
- //odczytywanie danych
- if((fd = open(argv[2+koduj], O_RDWR)) == -1)
- {
- perror("blad otwarcia pliku danych\n");
- return 2;
- }
- if(fstat(fd, &iwezel))
- {
- perror("blad fstat\n");
- return 3;
- }
- if((dane = mmap(NULL, iwezel.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == (void*)-1)
- {
- perror("blad mmap\n");
- return 4;
- }
- close(fd);
- for(i = 0; i < iwezel.st_size; i++)
- {
- if(koduj == 1) {
- dane[i] += klucz[i % r_klucz];
- } else {
- dane[i] -= klucz[i % r_klucz];
- }
- }
- printf("%d", r_klucz);
- msync(dane, iwezel.st_size, MAP_SHARED); //synchronizacja (zapisanie na dysk pliku z pamieci)
- munmap(dane, iwezel.st_size); //zwolnienie pamieci
- munmap(klucz, r_klucz);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement