Вот отрывок кода Code: .................................................................... rec=0;acum=0; for(;;) { rec=recv(s,Sr,1024*1024,0); Sr+=rec; acum=acum+rec; if(rec==0){Sr-=acum;break;} } closesocket(s); alen=(strlen(Sr)-strlen(strstr(Sr,"\r\n\r\n")))+4; Sr+=alen;//обрезка заголовка Graphics::TBitmap * Bitmap = new Graphics::TBitmap; TJPEGImage * examp = new TJPEGImage; TMemoryStream *stM = new TMemoryStream; br=acum-alen;//размер картинки memcpy(img,Sr,br);//картинка копируется в буффер stM->Position=0; stM->Write((const void*)img,br);//в поток examp->LoadFromStream(stM);//а тут ошибка 42 Bitmap->Assign(examp); PaintBox1->Canvas->Draw(59,59,Bitmap); delete examp; delete Bitmap; delete stM; Sr-=alen; .................................................................... Conten-Length нету в content type image\jpeg Скачаный и "очищенный" от заголовка файл начинается : Но всеравно компонента ругается 42й ошибкой =/ Путем метода тыка через сниффер оказалось что в моем коде размер картинки расчитывается на 12 байт больше чем показывает сниффер...Откудого они могут быть?И в какую часть файла попадают?
Code: LPVOID Inet_GET(IN LPSTR host, IN LPSTR request, IN LPSTR referrer,OUT LPDWORD retlen, IN BOOL KeepConnection) { LPCSTR szAccept[] = {"*/*", NULL}; LPCSTR szUserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3"; *retlen = 0; HINTERNET hInternet = InternetOpen(szUserAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL,0); DWORD flags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE; if(KeepConnection) flags |= INTERNET_FLAG_KEEP_CONNECTION; HINTERNET hConnect = InternetConnect(hInternet, host, 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); HINTERNET hRequest = HttpOpenRequest(hConnect, "GET", request, NULL, referrer, szAccept, flags, 0); HttpSendRequest(hRequest, 0, 0, NULL, 0); LPVOID outbuff = halloc(4096); LPVOID p = outbuff; DWORD size = 0, curr = 0; while(InternetReadFile(hRequest, p, 4096, &curr)==TRUE && curr !=0){ size += curr; outbuff = hrealloc(outbuff, size + 4096); p = (LPVOID)((DWORD)outbuff+size); } InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); *retlen = size; return outbuff; } ////////////////////////////////////////////////////////////////////////// LPVOID Get_Image(char *url, DWORD *len, char *referrer) { return Inet_GET("pix01.devki.ws", url, referrer, len, 0); }
попробуй сканить до яШя (FF D8 FF) - просто смысла не втжу сокет юзать для этого. хотя смотря какое тз
у тяж указатель буфера нигде не декрементится, значит и получаешь то что есть, хотя борланд-борланд) ааа хахах, вот в этом и задница в -= ) смотри с декрементом, тут твой косяк и лежит
капча не может быть больше метра точно, поэтому получай рекв 1 раз а не в цикле, далее сканируй буфер (бинарно а не стрстрами) до появления последовательности яШя и будет тебе радость и минус куча кода
Code: 6c9 яШяа JFIF Когда заголовок не указан, то размер данных передается сразу вначале блока данных, то есть 6c9 (в хексе) в твоем случае и есть размер картинки, а после этого числа и переноса строки идут сами данные.
аналогично //add unsigned int mystrlen(char *sstring) { char *start = sstring; while(*sstring++) ; return (unsigned int)(sstring-start-1); } unsigned int BinToDec(char *sStr) { // 1 0 1 0 1 1 0 0 (BIN) // 7 6 5 4 3 2 1 0 (offset) unsigned int total = 0; int nOff = 0; for(int i = mystrlen(sStr)-1; i >= 0; i--){ if(sStr=='1'){ total += pow(2, nOff)*1; } // иначе домнаживаем на ноль nOff++; } return total; } а каком формате то, приведи пример строки с хекс числом
Да уже нашол нужную ф-цию _http://devpinoy.org/blogs/cvega/archive/2006/06/19/xtoi-hex-to-integer-c-function.aspx Теперь проблема уже в борланде всеравно плюет той же самой 42й ошибкой хотя уже на диске оказывается полдноценная картинка Code: rec=0;acum=0; for(;;) { rec=recv(s,Sr,1024*1024,0); Sr+=rec; acum=acum+rec; if(rec==0){Sr-=acum;break;} } closesocket(s); alen=(strlen(Sr)-strlen(strstr(Sr,"\r\n\r\n")))+4; Sr+=alen; Graphics::TBitmap * Bitmap = new Graphics::TBitmap; TJPEGImage * examp = new TJPEGImage; TMemoryStream *stM = new TMemoryStream; strncat(imgS,Sr,3); xtoi(imgS,&br); Sr+=5; memcpy(img,Sr,br); HANDLE f=CreateFile("D:\\damp.jpeg",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_FLAG_RANDOM_ACCESS,NULL); DWORD wb; WriteFile(f,img,br,&wb,0); CloseHandle(f); //stM->Position=0; stM->Write((const void*)img,br); examp->LoadFromStream(stM); Bitmap->Assign(examp); PaintBox1->Canvas->Draw(59,59,Bitmap); delete examp; delete Bitmap; delete stM; Sr-=alen; Sr-=5;