kody > 127

0

Witam mam problem z poprawnym czytanie m polskich znaków w programie.
Mianowicie, gdy czytam plik i przychodzi do zczytania znaku np "ó" - ogolnie chodzi o znaki > 127 w ASCII(7bitów) to program ich nie rozumie i przypisywane są wielkie liczby, które nie mają pokrycia w rozszerzonym ASCII. Jak zrobić, aby te znaki były odpowiednio rozmoznawane przez program?!

0

Jakiś kod podaj, bo "program ich nie rozumie" to za mało...

0

Napisz, czy na konsoli, czy w oknie. Jesli w oknie to podaj z jakiej biblioteki korzystasz.

Problem sprowadza sie do konwersji napisow na UNICODE i odpowiedniego wyswietlenia ich.

0

Konsola gmp.h

do kodowania duzych bardzo duzych liczb

FILE *file_write2;
	int cvd_p;
	char const *ch;
	string str, tmp;			//zmienna przekazywana do mpz_init
	int z;				//zmienna int wartosc zamieniana na string
	mpz_t e, d, n;
	mpz_t m;
	mpz_t c;
	mpz_t m2;
	
	mpz_init(n);
	mpz_init(e);
	mpz_init(d);
	mpz_init(m);
	mpz_init(m2);
	mpz_init(c);
	
	/*tworzenie klucza*/
	UtworzKlucz(e,d,n,bit);
//	Wyswietl("d = ",d);
//	Wyswietl("e = ",e);
//	Wyswietl("n = ",n);
	/*dane wejsciowe*/
//	ofstream a_plik("plik.wyj",ios::app);
	file_write = fopen("plik.wyj","ab");

	CzytajPlik();		//czytam plik
	for(int i = 0; i < ROZMIAR-1; i++){
		
		z = (int)TAB[i];
	//	cout<<"z: "<<z<<endl;
		sprintf((char*)tmp.c_str(),"%d ",z);
		ch = tmp.c_str();
	
		mpz_set_str(m,ch,10);
		mpz_t wynik;
		mpz_init(wynik);
		mpz_mod(m,m,n);
	//mpz_mod(m,m,n);	//pierwotnie bylo tak
		//Wyswietl("\nWiadomosc: ",m);
	
	/*szyfrowanie*/
		szyfracja(c,m,e,n);
		//Wyswietl("\nWiadomosc zaszyfrowana: ",c);
		//cvd_p = mpz_get_si(c);
		mpz_out_str(file_write,10,c);
		fprintf(file_write,"\n");
	/*odszyfrowanie*/
		if(i == ROZMIAR-2){
			//zamykamy stary plik
			fclose(file_write);
			file_write=fopen("plik.wyj","rb");
			file_write2 = fopen("plik.wej_kopia","ab");
			//otwieramy ten sam plik, ale do odczytu
			int value=0;
			char znak;
			while(!feof(file_write) && mpz_inp_str(c,file_write,10)){
			
		//	Wyswietl("\nOdczyt: ",c);	
			//deszyfracja
			deszyfracja(m2,c,d,n);
			value = mpz_get_si(m2);
		//	sleep(1);
			cout<<value<<endl;
			znak = (char)value;
			fwrite(&znak,1,1,file_write2);	
			//Wyswietl("\nWiadomosc odszyfrowana: ",m2);
			}
		}
	}
	/*deinicjalizacja zmiennych*/
	mpz_clear(n);
	mpz_clear(e);
	mpz_clear(d);
	mpz_clear(m);
	mpz_clear(m2);
	mpz_clear(c);

błąd jest w kodowaniu znaków większych niż 127, kiedy chcę zaszyfrować mp3 to program się zapętla

0

listing funkcji CzytajPlik()

	FILE *file_read;
	file_read = fopen("plik.mp3","rb");	
	if(!file_read){
		cout<<"Nie mozna otworzyc pliku"<<endl;
		return ;
	}

	fseek(file_read,0,SEEK_END);	//ustawiam znacznik na koniec pliku
	ROZMIAR = ftell(file_read);	//zapisuje rozmiar pliku
//	cout<<"Czytany plik ma rozmiar: "<<ROZMIAR;
	fseek(file_read,0,SEEK_SET);	//ustawiam znacznik na poczatek pliku
	TAB=new char[ROZMIAR];	//przydzial pamieci

	if(!TAB)			//czy pamiec zostala przydzielona
	{
		cout<<"Blad przydzialu pamieci"<<endl;
		fclose(file_read);
		return ;
	}
	while(fread(TAB,ROZMIAR,1,file_read));		//zapisuje do buffer caly plik
	//pozadki
	fclose(file_read);
0
z = (int)TAB[i];
sprintf((char*)tmp.c_str(),"%d ",z);

Linia ze sprintf jest błędna. To co zwróci c_str jest tylko do odczytu, nie możesz tej pamięci zmieniać. Jeśli chodzi o pierwszą linię, char z reguły jest typem signed, więc wszystkie kody powyżej 127 będą liczbami ujemnymi. Nie wiem czy to ma znaczenie dla reszty kodu, ale jeśli ma, popraw tę linię na:

z = (unsigned char)TAB[i];

No i nie nazywaj zmiennych z dużymi literami...

0

0x666 Bardzo mi pomogłeś. Wielkie dzięki.

0

Występuje natomiast problem z dużymi plikami. kodowanie się zapętla.

0
while(fread(TAB,ROZMIAR,1,file_read));  

A ta pętla po co?

0

Program jest napisany, abym mogl zobaczyc czy poprawnie odszyfrowuje wiadomosc.

0

program dziala dobrze natomisast zapisuje wartosci bardzo duze do pliku i temu dlugo dziala i ma bardzo duzy rozmiar. Co do tej petli while(...) jest komentarz, ze zapisuje do bufora znaki.

Thx a lot!!!

0

Co do tej petli while(...) jest komentarz, ze zapisuje do bufora znaki.

Tyle to się domyśliłem, tylko po co ta pętla, jeśli jedno wywołanie fread załatwia sprawę?

0

Tak jak napisalem. Program pisalem na poczatku dla malych liczb long long int :), które później nie wystarczyły i trzeba było zaprząc do pracy gmp.h i tak z jednego kodu trzeba było napisać drugi. Korekty z tą pętlą to juz sprawy kosmetyczne.

Jeszcze raz dzięki za zwrócenie uwagi i pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1