.xnb - формат конвейера контента XNA Game Studio. На XBOX 360 данные сжаты с использованием набора функций Xbox XMemCompress API. Собственно, именно ими я и попытался распаковать один из файлов:
char Magic[3];
char Platform;
char XNBFormatVersion;
char FlagBits;
SIZE_T CompressedFileSize;
SIZE_T DecompressedDataDize;
FILE* xnbFile = NULL;
errno_t err = fopen_s(&xnbFile, "bg0.xnb", "rb");
if(!err)
{
fread(Magic, 1, 3, xnbFile);
fread(&Platform, 1, 1, xnbFile);
fread(&XNBFormatVersion, 1, 1, xnbFile);
fread(&FlagBits, 1, 1, xnbFile);
fread(&CompressedFileSize, sizeof(UINT32), 1, xnbFile);
fread(&DecompressedDataDize, sizeof(UINT32), 1, xnbFile);
printf("Compressed sixe: %d, decompressed size: %d\n", CompressedFileSize, DecompressedDataDize);
XMEMDECOMPRESSION_CONTEXT decmpContext = NULL;
HRESULT hr = E_FAIL;
hr = XMemCreateDecompressionContext(XMEMCODEC_DEFAULT, NULL, 0, &decmpContext);
if(FAILED(hr))
{
printf("Decompression Context Creation Failed\n");
fclose(xnbFile);
return -1;
}
SIZE_T CompressedDataSize = CompressedFileSize-12;
char* pCompressedData = new char[CompressedDataSize];
fread(pCompressedData, 1, CompressedDataSize, xnbFile);
char* pDecompressedData = new char[DecompressedDataDize];
printf("Decompression...\n");
hr = XMemDecompress(decmpContext, pDecompressedData, &DecompressedDataDize, pCompressedData, CompressedDataSize);
if(FAILED(hr))
{
printf("Decompression failed\n");
}
else
{
printf("Decompression successful\n");
}
delete [] pCompressedData;
delete [] pDecompressedData;
fclose(xnbFile);
}
else
{
printf("Can't open file\n");
}
Контекст создается успешно, но программа виснет на вызове XMemDecompress. Никакой допольнительной информации получить не удается.
Я подумал, что вряд ли Microsoft самостоятельно разработали алгоритм сжатия. Вероятнее всего они взяли что-нибудь готовое.
Собственно, вопрос: не пытался ли кто-нибудь распаковать данные этого формата? Какой алгоритм сжатия в нем используется?