Press "Enter" to skip to content

zabawa

Ostatnio się bawiłam w kodzie. (Thx idlecode za podsunięcie pomysłu) i wyszło mi coś takiego. Poziom może niski, ale przynajmniej działa. Jak co pejstnę:

#include <iostream>
#include <string>
#include <cstdlib>
 using namespace std;

 union kluczyk{
        long knum;
        char ktab[4];
 };

 int main(){

     string napis;
     string wynik;

     unsigned int licznik_klucza = 0;
     unsigned int licznik_pola = 0;

     kluczyk kej;
        cout<<"\nPodaj liczbę będšcš kluczem: ";
        cin>>kej.knum;
//        cout<<"Wczytano "<<kej.knum<< "inaczej: \n";
//        for (int i = 0; i<4 i++){
//            cout<<kej.ktab[i]<<endl;
//        } //przeszło

        cout<<"\nPodaj tekst do zaszyfrowania: ";
        cin>>napis;
       // cout<<"Wczytano "<<napis; /*Napis wczytany prawidłowo*/
        do{
            licznik_klucza = licznik_pola % 4;
            cout<<licznik_klucza;
            wynik.resize(licznik_pola+1, '0');
            wynik.at(licznik_pola) = kej.ktab[licznik_klucza] ^ napis.at(licznik_pola);
            licznik_pola ++;

        }while (licznik_pola < napis.length());
        //while (napis.at(licznik_pola) != '\0');
        cout<<"wynik: "<<wynik<<endl;
 }

A to wersja dla plików

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <cstdio>

using namespace std;

union kluczyk{
        long long knum;
        char ktab[8];
 };

 int main(int argc, char* argv[]){
//------------------------przygotowanie zmiennych -----------------------------
    fstream zrodlo, cel;

 //--------------Sprawdzenie poprawnoœci iloœci argumentów--------------------
    if ((argc <2) || (argc > 3)){
            cerr<<"\nBłąd wywołania. Spróbuj "<<argv[0]<<" --help";
            exit(1); //Błąd wywołania
        }

//----------------Przygotowanie danych dla szyfrowania------------------------------
    unsigned int licznik_klucza = 0;
    unsigned int licznik_pola = 0;
    kluczyk kej; //Tu będę przechowywać klucz, pobierany w takiej formie jaka nam pasi:)
    kej.knum = 0;
    if (!((string)argv[1]=="--help")){   //Przy helpie nie ma potrzeby podawania klucza;)
    cout<<"\nPodaj klucz (liczbowy, im większa tym lepiej, \nale nie większa niż 9223372036854775807): ";
    cin>>kej.knum;
    cout<<endl;
}
//------------Dane gotowe-------------------------------------------------------------

     if (argc ==2){
            if ((string)argv[1]=="--help"){
                cout<<"Program szyfruje plik Ÿródłowy ";
                cout<<endl<<"Wywołanie: "<<argv[0]<<" <plik_Ÿzródłowy> [plik_wynikowy]"<<endl;
                cout<<"Plik Ÿzródłowy musi być podany i musi istnieć. \n";
                cout<<"W przypadku braku podania celu, wypluwa zawartoœć na ekran (ale to krzaki)\n";
                cout<<"Najlepiej podawać duże liczby.\n";
                exit(0); //poprawne zakończenie funkcji przy helpie
            }
//----------------Obsługa szyfrowania z wywalaniem na ekran--------------------
            zrodlo.open(argv[1], ios::in|ios::binary);
            if (!zrodlo.good()){
                cerr<<"\nBłąd otwarcia pliku.";
                exit(2); //błąd otwarcia pliku Ÿródłowego
            }
            //właœciwe przeszyfrowanie z wypluciem na ekran
            char znak, wynik;
            unsigned int kolumna;
            cout<<"\nPodaj szerokoœć kolumny przy wyœwietlaniu: ";
            cin>>kolumna;
            while (!zrodlo.eof()){
                    licznik_klucza = licznik_pola % 8;
                    zrodlo.get(znak);
                    wynik = kej.ktab[licznik_klucza] ^ znak;
                    licznik_pola ++;
                    if ((licznik_pola % kolumna) == 0) cout<<endl; //żeby ładniej wyœwietlało
                    cout<<wynik;
            } //od while (!zrodlo.eof())

            zrodlo.close();
            exit(0);
     } //od dwójki w argc

//-----------------------------teraz wywalamy z pliku do pliku:) ---------------------------

        zrodlo.open(argv[1], ios::in|ios::binary);
        if (!zrodlo.good()){
            cerr<<"\nBłąd otwarcia pliku.";
            exit(2); //błąd otwarcia pliku Ÿródłowego
        }

        cel.open(argv[2], ios::in);
        bool nadpisac = false;
        char a;
        if(cel){
            cout<<"\nPlik docelowy istnieje. Nadpisać? T/N: ";
            cin>>a;
            while(1){
            if (toupper(a) == 'T'){
                nadpisac = true;
                break;
            }
            else if (toupper(a) == 'N'){
                break;
                }
            else {
                cout<<"\nNadpisać? T/N:  ";
                cin>>a;
                continue;
            }

        }

    }

    cel.close();
    if ((!cel) || nadpisac ==true){
        cel.open(argv[2], ios::out|ios::binary);
        char znak, wynik;
         while (!zrodlo.eof()){
                    licznik_klucza = licznik_pola % 8;
                    zrodlo.get(znak);
                    wynik = kej.ktab[licznik_klucza] ^ znak;
                    licznik_pola ++;
                    cel.put(wynik);
            } //od while (!zrodlo.eof())

            zrodlo.close();
            cel.close();
            cout<<"\nZaszyfrowano. Wynik zapisano w "<<argv[2]<<".\n";
            cout<<"Odszyfrujesz tak jak szyfrowałeœ, jeżeli podasz ten sam klucz.";

    }
    else {
        cerr<<"Plik docelowy istnieje, a nadpisać zabroniono";
        exit(3);
    }
    return 0;

 } //od maina

😉  No dobra A tu macie całość, ze skompilowanymi binarkami do windy. Polecam te z 2, bo zostały przekonwertowane, by nie krzaczyły w terminalu:)
SSIJ_Z_TĄD