Просмотр полной версии : Неполучается загрузить капчу
Вот отрывок кода
.................................................. ..................
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
Скачаный и "очищенный" от заголовка файл начинается :
6c9
яШяа JFIF
Но всеравно компонента ругается 42й ошибкой =/
Путем метода тыка через сниффер оказалось что в моем коде размер картинки расчитывается на 12 байт больше чем показывает сниффер...Откудого они могут быть?И в какую часть файла попадают?
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 раз а не в цикле, далее сканируй буфер (бинарно а не стрстрами) до появления последовательности яШя и будет тебе радость и минус куча кода
6c9
яШяа JFIF
Когда заголовок не указан, то размер данных передается сразу вначале блока данных, то есть 6c9 (в хексе) в твоем случае и есть размер картинки, а после этого числа и переноса строки идут сами данные.
Гм а чем заменить atoi для hex числа?
аналогично
//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[i]=='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й ошибкой хотя уже на диске оказывается полдноценная картинка
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;
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot