Всем привет!
Пишу программу для раскодирования SDS файла(Спасибо товарищу San'OG за его подробное изложение структуры файла )
Уважаемые гуру не поможете разархивировать файл.
Делаю так:
unsigned char* input = new unsigned char[sd->compressedStreamSize];// unsigned char* out = new unsigned char[sd->uncompressedStreamSize]; fread(input, 1, sd->compressedStreamSize, f); UncompressData(input, sd->compressedStreamSize, out, sd->uncompressedStreamSize); fwrite(out, 1, sd->uncompressedStreamSize, dest);
структура sd:
struct StreamData{ int compressedStreamSizeWithHeader; bool compress;//? если 0 идет какая - то неизвестная фигня вместо сжатого блока int uncompressedStreamSize;// (по умолчанию 16384 байт или 16 КБайт) int iCount0; int iCount1; int iCount2; int compressedStreamSize; int iCount3; int iCount4; int iCount5; }; int readStreamHeader(FILE* f, std::ofstream& ofst, StreamData& sd){ int iSizeBuff = 0; ofst << "\n"; ofst << "StreamHeader " << "\n"; sd.compressedStreamSizeWithHeader; iSizeBuff += fread(&sd.compressedStreamSizeWithHeader, 1, 4, f); ofst << " compressedStreamSizeWithHeader: " << sd.compressedStreamSizeWithHeader << "\n"; bool bComp;// ? если 0 идет какая - то неизвестная фигня вместо сжатого блока iSizeBuff += fread(&bComp, 1, 1, f); ofst << " compress: " << bComp << "\n"; sd.uncompressedStreamSize;// (по умолчанию 16384 байт или 16 КБайт) iSizeBuff += fread(&sd.uncompressedStreamSize, 1, 4, f); ofst << " uncompressedStreamSize: " << sd.uncompressedStreamSize << "\n"; sd.iCount0; iSizeBuff += fread(&sd.iCount0, 1, 4, f); ofst << " Count0: " << sd.iCount0 << "\n"; sd.iCount1; iSizeBuff += fread(&sd.iCount1, 1, 4, f); ofst << " Count1: " << sd.iCount1 << "\n"; sd.iCount2; iSizeBuff += fread(&sd.iCount2, 1, 4, f); ofst << " Count2: " << sd.iCount2 << "\n"; sd.compressedStreamSize; iSizeBuff += fread(&sd.compressedStreamSize, 1, 4, f); ofst << " compressedStreamSize: " << sd.compressedStreamSize << "\n"; sd.iCount3; iSizeBuff += fread(&sd.iCount3, 1, 4, f); ofst << " Count3: " << sd.iCount3 << "\n"; sd.iCount4; iSizeBuff += fread(&sd.iCount4, 1, 4, f); ofst << " Count4: " << sd.iCount4 << "\n"; sd.iCount5; iSizeBuff += fread(&sd.iCount5, 1, 4, f); ofst << " Count5: " << sd.iCount5 << "\n"; return iSizeBuff; };
Вроде все правильно и до разархивирования все работает.
Функция разархивирования:
int UncompressData(unsigned char* abSrc, int nLenSrc, unsigned char* abDst, int nLenDst) { z_stream zInfo = { 0 }; zInfo.total_in = zInfo.avail_in = nLenSrc; zInfo.total_out = zInfo.avail_out = nLenDst; zInfo.next_in = abSrc; zInfo.next_out = abDst; int nErr, nRet = -1; nErr = inflateInit(&zInfo); // zlib function if (nErr == Z_OK) { nErr = inflate(&zInfo, Z_FINISH); // zlib function if (nErr == Z_STREAM_END) { nRet = zInfo.total_out; } } inflateEnd(&zInfo); // zlib function return(nRet); // -1 or len of output }
Наверно не правильные размеры сжатого и разархивированного файлов передаю в функцию.