

![]() |
![]() |
|
|||||||
![]() |
![]() |
| programowanie języki, projekty, pomoc, oprócz html, php, js |
|
|
|
LinkBack | Narzędzia wątku | Przeszukaj ten temat | Wygląd |
![]() |
![]() |
|
|||
|
Witam, chciałem napisać sobie algorytm szyfrowania XOR-em. Obecnie kod wygląda tak:
Kod:
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
char buf[255];
void zakoduj(char patch[], char key[],int len){
ifstream plik(patch);
char ch;
int i=0;
while (plik.get(ch)){
buf[i]=ch^key[i%len];
i++;
}
plik.close();
}
void zapisz(char patch[]){
ofstream zapis(patch);
zapis << buf ;
zapis.close();
}
int main(int argc, char *argv[])
{
zakoduj("J:\\lol.txt","TajnySzyfr",10);
//zapisz("J:\\lol.txt");
system("PAUSE");
return EXIT_SUCCESS;
}
|
![]() |
![]() |
![]() |
![]() |
|
||||
|
Google naprawdę nie gryzie.
Długość napisu c++ |
![]() |
![]() |
![]() |
![]() |
|
|||
|
Zgadnij gdzie wujek google najczęściej odsyła... Tak do takich for gdzie ludzie tacy jak Ty (Spamerzy piszący zbędnie w temacie) odsyłają do google... I tak koło zatacza nieskończony krąg, zresztą na 1 stronie Twojego wyszukania jest pobieranie długości stringa, a ja korzystam z tablicy char.
Edit@: Kombinowałem przekształcając z buf[i]=ch^kod[i%len]; na buf[i]=ch^kod[i% sizeof(kod)-1]; Niestety wtedy wynik kodowania jest inny i czasami występują dziwne efekty uboczne. Dziwne skoro sizeof(kod)-1 zwraca dokładnie taka sama wartość jaką przekazywałem w wartości len. Ostatnio edytowane przez Red21a ; 02.09.2010 o 14:13. |
![]() |
![]() |
![]() |
![]() |
|
||||
|
Co nie zmienia faktu, że pytanie jest banalne i spokojnie znalazłbyś odpowiedź za pomocą google. Szybko powinieneś znaleźć, że tablica charów, czyli "char array" to tak zwany c-string lub cstring (nie mylić z klasą CString z MFC). O dziwo w C++ nagłówki z biblioteki standardowej C wpisuje się w formie <cnazwa> - więc <string.h> w którym są funkcje działające na c-stringach - to w C++ <cstring>. To oczywiście powinieneś wiedzieć z tutoriala, książki czy manuala.
Możemy więc zacząć poszukiwania, wpisać na przykład "cstring length" - pierwszy odnośnik: poznajemy po wielkości liter ("CString" w wycinku strony) i fragmencie linku ("mfc/mfc-tutorials"), że jest bezużyteczny dla nas, bo mówi o CString. Drugi prowadzi do listy funkcji w <cstring> w manualu: http://www.cplusplus.com/reference/clibrary/cstring/ Trzeci prosto do naszej funkcji: http://www.cplusplus.com/reference/c...string/strlen/ No, muszę otrzeć pot z czoła. ![]() A tak poważniej, to może powinieneś po prostu użyć std::string (nagłówek <string>), skoro już i tak używasz innych rzeczy z biblioteki standardowej C++. c-stringi nie są zbyt poręczne, co szybko zauważysz. std::string -> http://www.cplusplus.com/reference/string/string/ edit: sizeof() zwróci Ci wielkość tablicy, tak, ale po przekazaniu jej do funkcji, wszystko się komplikuje... Zobacz na przykład co będzie, jeśli utworzysz dynamicznego c-stringa, sizeof() zwróci Ci wielkość wskaźnika, a nie c-stringa. Nie polegaj na sizeof() jeżeli chcesz poznać wielkość tablicy, przechowuj jej rozmiar w osobnej zmiennej, tak będzie najlepiej. Jeżeli chodzi o c-string - miej świadomość, że strlen() zwróci Ci długość c-stringa a nie całej tablicy. Jeżeli masz char str[100]; a wartość str to "tyłek\0" gdzie '\0' to jeden znak, jak wiesz oznacza on koniec c-stringa, to strlen(str) zwróci Ci wartość 5, a nie 100.
__________________
Programowanie w C, C++, PHP, Java, ECMAscript, oraz prace w HTML+CSS. PW ![]() Kolorowanie kodu C/C++/Java/PHP w BBCode (pod peb.pl) -> KLIK Ostatnio edytowane przez AzraelValedhel ; 02.09.2010 o 14:26. |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|
|||
|
Już dawno to dostrzegłem, dlatego też nie skorzystałem z string.h.
Dzięki, Azrael tego szukałem, jednak nie musiałeś się aż tak mordować wystarczyło powiedzieć, że to strlen();. ![]() |
![]() |
![]() |
![]() |
![]() |
|
|||
|
Mam jeszcze jeden problem. Nie rozumie tego mimo, że wykonałem parę testów.
Kod:
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
char buf[255];
void XOR(char patch[], char key[]){
ifstream plik(patch);
char ch;
int i=0;
while (plik.get(ch)){
buf[i]=ch^key[i%strlen(key)];
i++;
}
plik.close();
}
void zapisz(char patch[]){
ofstream zapis(patch);
zapis << buf ;
zapis.close();
}
int main(int argc, char *argv[])
{
XOR("J:\\lol.txt","XYZTO7");
zapisz("J:\\lol.txt");
system("PAUSE");
return EXIT_SUCCESS;
}
Kod:
for(i=0;strlen(tex)>=i;i++){
buf[i]=tex[i]^key[i%strlen(key)];
W tym jak i wcześniejszym wypadku zakodowana jest tylko część tablicy do fragmentu "aaa". strlen(tex); wykazuje długość 12 znaków. Co jest nie tak? |
![]() |
![]() |
![]() |
![]() |
|
||||
|
szczerze to u mnie to działa. zapisuje do pliku cały tekst, łącznie ze spacjami(zamienionymi oczywiście)
|
![]() |
![]() |
![]() |
![]() |
|
|||
|
Nie, kompilator nic nie dostaje. To czasami działa, a czasami nie. To już nie pierwszy taki problem, który spotyka mnie na tym komputerze a na innych działa bez problemu. Ostatnio napisałem program do transferu plików w p2p i po skompilowaniu na moim systemie gubił czasem pakiety, a wersja skompilowana u mojego brata nigdy. Ja mam win 7, a on XP Wersia systeu? Coś z bibliotekami systemowymi? choć patrząc na to realnie nie powinno być różnicy.
|
![]() |
![]() |
|
| Narzędzia wątku | Przeszukaj ten temat |
| Wygląd | |
|
|
Podobne wątki
|
||||
| Temat | Autor wątku | Forum | Odpowiedzi | Ostatni post/autor |
| [C++ Builder, Windows 7] XOR i błędy z nim | starjacker0 | programowanie | 12 | 30.08.2010 08:01 |
| Szyfrowanie algorytmem XOR | kamilos876 | programowanie | 7 | 30.07.2010 11:29 |
| algorytm xor | Deviat | programowanie | 3 | 11.12.2008 15:42 |
| [asm] algorytm xor | bulletx | programowanie | 1 | 18.10.2008 11:06 |
| [Delphi] Szyfrowanie XoR | Metis | programowanie | 0 | 02.01.2008 03:00 |
| Wszystkie czasy w strefie GMT +2. Teraz jest 18:34. |

