Пакую так в BCB(текстовый файл) Код (Text): OpenDialog1->Execute(Form1->Handle); HANDLE f=CreateFileA(AnsiString(OpenDialog1->FileName).c_str(),GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if(f!=INVALID_HANDLE_VALUE) { uLongf inSZ=1024*1024; uLongf outSZ=2*(1024*1024); Bytef *INbuf=new Bytef[inSZ]; memset(INbuf,0,inSZ); Bytef *OUTbuf=new Bytef[outSZ]; memset(OUTbuf,0,outSZ); DWORD r=0,w=0; ReadFile(f,INbuf,inSZ,&r,0); wchar_t *unibuf=new wchar_t[outSZ]; MultiByteToWideChar(CP_ACP,0,INbuf,-1,unibuf,outSZ); Memo1->Lines->Add(UnicodeString(unibuf)); Memo1->Lines->Add("----------------------------------------------------"); memset(unibuf,NULL,outSZ); compress(OUTbuf,&outSZ,INbuf,inSZ); CloseHandle(f); f=CreateFileA("test.pck",GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); WriteFile(f,OUTbuf,outSZ,&w,0); CloseHandle(f); memset(INbuf,0,inSZ); ShowMessage(inSZ); uncompress(INbuf,&inSZ,OUTbuf,2*(1024*1024)); MultiByteToWideChar(CP_ACP,0,INbuf,-1,unibuf,2*(1024*1024)); Memo1->Lines->Add(UnicodeString(unibuf)); delete []INbuf; delete []OUTbuf; delete []unibuf; } Распаковываю в Visual Studio Код (Text): HANDLE f=CreateFileA("C:\\Users\\user\\Documents\\RAD Studio\\Projects\\packer\\Debug\\test.pck",GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if(f!=INVALID_HANDLE_VALUE) { uLongf inSZ=1024*1024; uLongf outSZ=2*(1024*1024); Bytef *INbuf=new Bytef[inSZ]; memset(INbuf,0,inSZ); Bytef *OUTbuf=new Bytef[outSZ]; memset(OUTbuf,0,outSZ); DWORD r=0; ReadFile(f,INbuf,inSZ,&r,0); printf("uncompress:%d\n",uncompress(OUTbuf,&outSZ,INbuf,inSZ)); printf("Decompressed sz: %d\n",inSZ); getch(); printf("%s",INbuf); } else { printf("fail open file"); } getch(); Проблема в том что при распаковке полная пурга получается,хотя и uncompress возвращяет 0.В чем может быть проблема?(
Ппц, мои глаза, ну и код. 1. Во-первых, если уж запаковывать и распаковывать, то нужно хотя бы писать в файл размер упакованных данных. И не делать никаких предположений о размерах буферов, а нормально рассчитывать количество памяти, которое необходимо выделять для вызова каждой из функций. Естественно, у тебя полная чушь получается. В частности, при запаковке ты пишешь в файл outSZ байт: WriteFile(f,OUTbuf,outSZ,&w,0); При этом outSZ у тебя равно значению, возвращенному функцией compress во втором параметре, переданном по указателю. Соответственно, такой же объем данных нужно и распаковывать, но распаковывается у тебя почему-то жестко захардкоденное (1024*1024) количество байт. 2. Во-вторых, почитай хоть какие-нибудь правила о стиле кодирования - о расстановке пробелов, именовании переменных и т.п. Без них код полное нечитаемое УГ. Для лабы (как я понял, это лаба) конечно сойдет, но нормальный код так писать нельзя. 3. Не специалист во всяких BCB, но на 99.9% был уверен, что есть нормальные средства преобразования AnsiString в UnicodeString и Win32-функции использовать для этого не нужно. И точно, погуглив, стало известно, что UnicodeString имеет конструктор UnicodeString(const char*). Смысл тогда городить велосипеды? Код должен выглядеть примерно так (хотя все равно он УГ, но для лабы сойдет). Запаковка: Код (Text): OpenDialog1->Execute(Form1->Handle); HANDLE hFile = CreateFileA(AnsiString(OpenDialog1->FileName).c_str(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) return; //нефиг плодить лишние уровни вложенности отступов uLongf inSize = 1024 * 1024; Bytef *inBuf = new Bytef[inSize]; //memset тут нафиг не нужен //operator new[] и так инициализирует массив значениями по умолчанию (0 для целочисленных типов) ReadFile(hFile, inBuf, inSize, &inSize, NULL); // считываем максимум 1MB, но фактический размер файла может быть меньше CloseHandle(hFile); Memo1->Lines->Add(UnicodeString(reinterpret_cast<const char*>(inBuf))); Memo1->Lines->Add("----------------------------------------------------"); uLongf outSize = compressBound(inSize); Bytef *outBuf = new Bytef[outSize]; compress(outBuf, &outSize, inBuf, inSize); hFile = CreateFileA("test.pck", GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); DWORD w = 0; WriteFile(hFile, &inSize, sizeof(inSize), &w, NULL); //пишем размер исходных данных WriteFile(hFile, outBuf, outSize, &w, NULL); CloseHandle(hFile); memset(inBuf, 0, inSize); ShowMessage(inSize); uncompress(inBuf, &inSize, outBuf, outSize); Memo1->Lines->Add(UnicodeString(reinterpret_cast<const char*>(inBuf))); delete []inBuf; delete []outBuf; Распаковка: Код (Text): HANDLE hFile = CreateFileA("C:\\Users\\user\\Documents\\RAD Studio\\Projects\\packer\\Debug\\test.pck", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) { uLongf outSize; uLongf inSize = GetFileSize(hFile, NULL) - sizeof(outSize); Bytef *inBuf = new Bytef[inSize]; DWORD r; ReadFile(hFile, &outSize, sizeof(outSize), &r, NULL); ReadFile(hFile, inBuf, inSize, &r, NULL); Bytef *outBuf = new Bytef[outSize]; printf("uncompress: %d\n", uncompress(outBuf, &outSize, inBuf, inSize)); printf("Decompressed sz: %d\n",inSize); getch(); printf("%s", inBuf); delete[] inBuf; delete[] outBuf; } else { printf("cannot open file"); } getch();
Я был уставший, и просто при распаковке попутал память с результатом анпака Сори ,что затавил кого то вчитыватся в мой код.