Всем привет!
Пишу программу для раскодирования 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
}
Наверно не правильные размеры сжатого и разархивированного файлов передаю в функцию.



Публикации
Не указал
