Pobieranie obrazka z www

0

witam,

Pisze program który pobiera pliki z www. Wszystko pobieram za pomocą socketów.

char recvbuffer[1024];
nRet = recv(tcp_socket, recvbuffer, sizeof(recvbuffer), 0);

I o ile tekst pobiera się bez problemu, o tyle pliki binarne nie. Maja taki sam rozmiar jak oryginał jednak 'zawartość' jest <ort>nie co</ort> inna.

Czy muszę (jak tak to co) zrobić aby otrzymać normalny plik binarny ?

0

co rozumiesz przez 'nieco inna' ?

0

może zaprezentuje :)
http://struthio.ovh.org/other/diff_hex.JPG

//q: ups.. znowu nacisnalem Edytuj zamiast Cytuj i tutaj napisalem odpowiedz.. post sie zniszczyl, sorry:(

0

dobra właśnie coś zauważyłem. plik ściągnięty zaczyna się psuć od pierwszego wystąpienia bajtu '00' ale czy to możliwe, że przez to przesuwa bajty ? ... ale dlaczego plik ściągnięty ma taki sam rozmiar jak oryginał ?

0

Jak zapisujesz plik? To wyglada jakbys zapisywal plik 'tekstowo', stad blad przy pierwszym znaku 'specjalnym'.

0

diffhex z kolei pokazuje jeszcze jedna mala rzecz - dokladnie cztery bajty sa sciagniete prawidlowo, moze wiec u Ciebie w Twoim kodzie RECVBUFFER w rzeczywistosci nie jest statyczna tablica i ma typ char* ?

0

Aaaa stary już wiem.
Jak wysyłasz żądanie o pobranie obrazka to zapewne masz w nim:

Accept-Encoding=gzip,deflate

Wywal to z żądania bo inaczej będzie ci pakował obrazek jakimś programem i otrzymasz spakowane dane... :/

Miałem to samo jak pobierałem stronę internetową, też po pierwszym \0 jakieś głupoty mi wypisywał..., bo właśnie do pierwszego \0 jest nagłówek.

Pozdrawiam :)

//Edit U mnie śmiga bez problemów :)
Musisz tez pamiętać ze przesyłane dane mogą mieć \0, a jak wiadomo kopiując chary w których jest \0 do stringa to przekopiuje tylko wiadomosc do pierwszego wystapienia \0

string KlientTCP::Odbierz()
{
	string wiadomosc;
	char tmp[1024];
	memcpy(tmp,"\0",1024);
	int odeb = 0;
	while ( (odeb = recv(gniazdo,tmp,1024,0)) > 0 )
	{
		wiadomosc.append(tmp,odeb);
		memcpy(tmp,"\0",1024);
	}

	return wiadomosc;
}

0

nie wiem co z Toba zrobic.. nie zauwazyles ze ten watek jest stary i skasowalem Twoje wczesniejsze posty lekko nie na temat? co do accept-encoding mam dejavu' albo cos, bo dopiero co komus pisalem o gzip.. moze pomyliles watki i chciales w tamtym odpisac? ten "jakimś" program to GZIP i jest to STANDARDOWA kompresja na protokole http. trzeba sobie odpakowac. i oczywiscie ze skompresowany strumien moze zawierac \0 bo to tresc binarna..

0

Bana Mi! Za to że staram się pomóc!
No i co z tego że stary ja szukałem w googlach rozwiązania tego problemu i trafiłem na ten temat jak ktoś będzie szukał to od razu będzie miał gotową odpowiedz.

Trzeba jeszcze pamiętać, żeby binarnie przesyłać

plik.open("1.jpg", ios_base::out | ios_base::binary);
plik << zdje;

Bana mi!

0
Liseeeek napisał(a)
char tmp[1024];

memcpy(tmp,"\0",1024);

Z tym to przekombinowałeś...

0

Ale kicha to forum nie ma wiadomości prywatnych przez co OT się robi....

0x666 napisał(a)

Z tym to przekombinowałeś...
Hmmm jakbyś mógł powiedzieć o co chodzi to byłbym wdzięczny, bo nie za bardzo rozumiem...

Pozdrawiam

0

Kopiujesz 1024 bajty ze stringa, który ma jeden bajt długości. Chyba chodziło Ci o memset...

0

Oh dzięki :)
Kocham Cię!

0
0x666 napisał(a)
Liseeeek napisał(a)
char tmp[1024];
memcpy(tmp,"\0",1024);

Z tym to przekombinowałeś...

0x666 napisał(a)

Kopiujesz 1024 bajty ze stringa, który ma jeden bajt długości. Chyba chodziło Ci o memset

tak, przede wszystkim, nie memcpy a memset.. a w ogole, to taka tablice mozna po prostu owymi zerami ... zainicjalizowac

char tmp[1024]={0,}
Liseeeek napisał(a)

Ale kicha to forum nie ma wiadomości prywatnych przez co OT się robi....

wiadomosci sa, tylko schowane. kliknij na swoj nick/profil na gorze, nastepnie wybierz 'zakladke' wiadomosci i kliknij 'napisz wiadomosc'

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