Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Problem] Pseudo-Kodowanie :P


Rekomendowane odpowiedzi

Opublikowano

Witam, to znów ja :P

 

Mam pewien problem. Chciałem napisać Program, który potrafiłby zakodować pliki.

I tu leży mój problem. W C++ nie jestem zbytnio zaawansowany, więc ciężko mi walczyć z błędami, których

nigdy na oczy nie widziałem ;)

 

Oto Source mojego Pseudo-Kodera:

 

 


#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>

using namespace std;
fstream file;
char plik[21];
char tresc[100000];

int main()
{
   cout << "   #######   #######   #######   	#   	#####\n";
   cout << "  #          #              #   	# #      #    #\n";
   cout << "  #          #####        #        #   # 	#####\n";
   cout << "  #          #          # 		#######    #   #\n";
   cout << "   #######   #######   #######   #   	#   #    #\n";


   cout << "\n\n";
   cout << "Wpisz nazwe pliku, ktory ma zostac zaszyfrowany:\n";
   cin >> plik;
   // cout << "Teraz test\n Nazwa pliku to: \n" << plik << "!\n\n";
   // system("pause");
   string nazwa = plik;
   fstream open( nazwa.c_str(), ios::in | ios::out );
   switch( open.good() )
   {
           case 1:
    			// cout << "\nPlik istnieje \n";
    			open.read( tresc, 100000 );
    			string pliczek = tresc;
    			string crypt = pliczek.c_str() + 1;
    			open.flush();
    			open.close();
    			ofstream   	file(nazwa.c_str());
    			file << crypt.c_str();
    			return 0;
    			break;
           case 0:
    			cout << "\nPlik nie istnieje lub nie ma go w folderze Cezara!\n";
    			break;
   }
   system("pause");
}

 

Takie błędy wyskakują w konsoli:

 

85845353.jpg

 

Prosiłbym o pomoc kogoś doświadczonego. Jeśli to możliwe, proszę również o poprawienie kodu :)

Opublikowano

Thaa... Chyba nikt się nie odezwie :)

Wszystko dobrze prócz twojego switcha, przeanalizuj kod...

O ile nie skopiowałeś bezmyślnie to zrobisz to z łatwością...

 

//Tu tylko poprawiłem błędy, program i tak będzie źle chodził, wczytaj znak po znaku i każdy zmień :)

Na razie twój program wczytuje wszystko i dodaje do tego 1...

a to nie o to chodzi, wczytujesz każdy znak i każdy znak zmieniasz

 

Zaciekawił mnie ten pomysł i zrobiłem coś takiego :D

 

Download

 

Zaraz dam edita ze skanem, 37 w kolejce :D

 

Wkurzyłem się na virustotala :/

Virusscna.jotti.org:

Skan

Opublikowano

Ok, dzięki za odpowiedź. Jakby co, kod pisałem sam, bardzo rzadko zdarza się, żebym kopiował czyjś kod :P

 

@Edit:

Pojedyncze literki też zmienię używając biblioteki fstream, czy muszę użyć jeszcze jakiejś dodatkowej?

Opublikowano

Wszystko tak jak jest...

fstream starczy :)

chodzi o to że:

znak=tresc[ktore z kolei]+1

a później

calosc+=znak

i zapisujesz calosc do pliku

 

Nie wiem jak, ale dałem ci przykładowy kod :D

Mało komu daje...

 

//Edit:

Popraw switcha i skompiluj, będziesz wiedział o co mi chodzi :)

Opublikowano

Spoko, już wszystko wiem.

Napisałem program od nowa i już wiem, że dość mocno sknociłem tamten ^^

 

Tak czy siak, dzięki za pomoc ;)

 

Można zamknąć :P

Budowniczy
Opublikowano

Wszystko tak jak jest...

fstream starczy :)

chodzi o to że:

znak=tresc[ktore z kolei]+1

a później

calosc+=znak

i zapisujesz calosc do pliku

 

Nie wiem jak, ale dałem ci przykładowy kod :D

Mało komu daje...

 

//Edit:

Popraw switcha i skompiluj, będziesz wiedział o co mi chodzi :)

 

Masz szczęście, że dostąpiłeś takiego zaszczytu.

Opublikowano

Non, co ty, masz jakiś generator tych kolorowych napisów? A po za tym nic nie wnosisz do tematu, autor już rozwiązał problem, nieprawdaż?

Opublikowano

Sry za odkopywanie, ale dla autora mam zadanko, żeby się poduczył trochę :)

Dopiero teraz napis Cezar przyciągnął moją uwagę, czy to nie miał być szyfr Cezara? Może to twój pseudonim czy coś?

Ale teraz zadanie:

Napisz program, który szyfruje i deszyfruje podane pliki szyfrem cezara, gdzie podajesz o ile się przesuwają znaki, u Cezara były to 3 miejsca.

 

Uważa się, że szyfr ten był używany przez Juliusza Cezara. W

dzisiejszych czasach złamanie tego szyfru zajęłoby dosłownie sekundę,

jednak wówczas szyfr ten był zupełnie wystarczający. Polega on na

przesunięciu liter o trzy pozycje. W ten sposób napis "Projekt

CODE" po zaszyfrowaniu wygląda tak: "Surmhnw FRGH". Szyfr

Cezara można bardzo łatwo uogólnić do takiej postaci, że przesuwa się

nie o 3, lecz o n znaków.

Opublikowano

Sorki, że dopiero teraz, ale trochę mi zajęło pisanie ^^

 

Tutaj Program:

http://www.speedyshare.com/files/27061702/koder.exe

Skan:

http://www.virustotal.com/file-scan/report.html?id=972c21b47f13af84656b1c677efb82c220deb33fd8f155dbd3e967219e022cd0-1298576020

Ma małą, wadę, możesz kodować i odkodować tylko napis, który ma 1 linijkę ;/

 

Jeśli chcesz zobaczyć Source, napisz na PW.

 

@Edit:

Przyznam się, że skorzystałem nieco z tego:

http://www.e-comet.info/szyfr-cezara-najstarszy-szyfr-id-9.html

:D

Opublikowano

źle działa,

 

napis "sarejow sarejowo"

 

po zaszyfrowaniu i odszyfrowaniu wychodzi "sarejow sarejowoü"

 

 

 

Co to za problem szyfrować cały plik, a nie tylko jedną linie?

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

1. Faktycznie, czasami na końcu dodaje jeszcze dodatkowy znak. Niestety nie wiem, dlaczego.

2. No, dla mnie to jednak jest problem, jak dla nowicjusza ;]

Opublikowano

dałem przesuniecie 10,pewnie odejmujesz lub dodajesz , a znak końca lini to bodajże NULL. 0 - 10 = 246 , jeżeli patrzyc na ascii, napraw to

 

ASCII - 246 - ö

 

 

jeżeli zrobisz rzutowanie liczby -9 na char to bodajże będzie to wartośc 246, wynika to z liczby kombinacji bitów w jednym bajcie (0-256) wiec -9 bedzie liczone jako 246 czyli nieszczesne ö

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

Nie było by to dla mnie dziwne, gdyby nie to, że program dodaje taki znak tylko w krótszych tekstach. Spróbuj napisać coś dosyć długiego i ładnie zakoduje ;/

 

W razie czego daje aktualny:

http://www.speedyshare.com/files/27070018/koder.exe

 

Skan:

http://www.virustotal.com/file-scan/report.html?id=fd6a204b88f9d3320beb331190aafc74827ab2888f455671d6fc6c47874f6327-1298626395

 

@Edit:

A niech będzie, wstawię kod, na pewno będzie łatwiej zobaczyć o co chodzi:

 

 

 


#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
#include <cstring>
using namespace std;
string odszyfrowany, zaszyfrowany;
int main()
{
   char nazwa[51];
   int ile, tryb;
   cout << "Wpisz nazwe pliku (lacznie z rozszerzeniem):\n";
   cin >> nazwa;
   string nazwa2 = nazwa;
   cout << "\nWpisz, o ile miejsc maja zostac przesuniete znaki:\n";
   cin >> ile;
   cout << "\nWybierz Tryb: 1 - Kodowanie, 2 - Odkodowanie:\n";
   cin >> tryb;
   fstream plik;
   plik.open( nazwa2.c_str(), ios::in );
   if( plik.good() )
   {
       string napis;
       while( !plik.eof() )
       {
           if ( tryb == 1 )
           {
                                    getline( plik, napis );
                                    for (unsigned int i=0; i < napis.size(); ++i)
                                    zaszyfrowany[i] = (napis[i] + ile)%256;

                                    ofstream file(nazwa2.c_str());
                                    file << zaszyfrowany.c_str();
                                    cout << "\nTekst zostal zakodowany!\n";
           }
           else if  ( tryb == 2 )
           {
                                    getline( plik, napis );
                                    for (unsigned int i=0; i < napis.size(); ++i)
                                    odszyfrowany[i] =(napis[i] + 256 - ile)%256;

                                    ofstream file(nazwa2.c_str());
                                    file << odszyfrowany.c_str();
                                    cout << "\nTekst zostal odkodowany!\n";
           }
           else
           {
               cout << "Podany tryb nie istnieje!";
           }
       }
       plik.close();
   } else cout << "Error! Nie udalo otworzyc sie pliku!" << endl;

   getch();
   return( 0 );
}

 

 

Opublikowano

sprawdzaj w tych for'ach czy nie ma eof'a

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

Ta...

Napisz funkcje dekodującą i kodującą, google 10 sec, wczytuj znak po znaku i zakoduj cały string... Problem? :)

Zwykły koder (bez szyfru Cezara) też wrzuć :)

 

//Edit:

20 sec pisania i efekty są, choć czasem problemy z deszyfrowaniem są, ale nie będę się w to zagłębiać :)

To jest tak proste, że nie powinieneś mieć problemu, koder ma 2 szyfry, multilinijkowy (chyba, że plik dużo waży, to jest "upraszczany")

Download:

Klik

Skan:

Klik

Opublikowano

Przepraszam, że tak długo musieliście czekać na odpowiedź, ale mówiąc szczerze, na początku zamierzałem się poddać.

Ale dałem radę, zamiast getline, wykorzystałem do tego bufor, więc działa multilinijkowo ;)

 

Jak na razie, wrzucam koder, kodujący szyfrem cezara. Na zwykły musisz troszkę poczekać, uczę się kiedy tylko mogę :P

 

http://www.speedyshare.com/files/27157805/koder.exe

http://www.virustotal.com/file-scan/report.html?id=23e23becc8c1f60fef0c8397664962c5976c799b4438cab4108782768f288c3f-1299012508

 

P.S.

Do bufora zmieści się tylko 100 000 bajtów danych, więc radzę nie przesadzać ^^

Opublikowano

Nareszcie zmądrzałeś! Nie wiem po co żeś kod zmieniał :) Prawie wszystko było dobrze, u mnie tak samo tylko 100 000 bajtów :)

Inaczej plik się zmienia na 1 bajt.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...