Перейти к содержимому


MaksSh

Регистрация: 06 Aug 2017
Offline Активность: 09 Aug 2017 11:20
-----

Мои сообщения

В теме: Mafia 2 - разбор ресурсов

06 August 2017 - 11:03

Всем привет!

Пишу программу для раскодирования 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
}

Наверно не правильные размеры сжатого и разархивированного файлов передаю в функцию.