日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

游戏 Npk文件解压

發布時間:2023/12/9 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 游戏 Npk文件解压 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

涉及兩個結構體:

struct st_NpkHeader
{
?? ?int _magic;// ? ??? ??? ??? ??? ??? ?[_offset + 0]
?? ?int _count;// ? ??? ??? ??? ??? ??? ?[_offset + 4]?? ?size(count * 28)?? ?
?? ?int _unknonw2;
?? ?int _unknonw3;
?? ?int _bUseTrunkCompressType;
?? ?int _offset;
};

struct st_NpkTrunk
{
? ? int _trunkHash;
? ? int _dataOffset;
? ? int _compressSize;
? ? int _realSize;
? ? int _unknown1;
? ? int _unknonw2;
? ? int _compressType;
};


?完整代碼:

// UnNpk.cpp : 定義控制臺應用程序的入口點。
//
?
#include "./liblz4/lz4.h"
#include "./zlib/zlib.h"
#include "stdafx.h"
#include <string>
#include <io.h>
#include <direct.h>
struct st_NpkHeader
{
?? ?int _magic;// ? ??? ??? ??? ??? ??? ?[_offset + 0]
?? ?int _count;// ? ??? ??? ??? ??? ??? ?[_offset + 4]?? ?size(count * 28)?? ?
?? ?int _unknonw2;
?? ?int _unknonw3;
?? ?int _bUseTrunkCompressType;
?? ?int _offset;
};
?
struct st_NpkTrunk
{
?? ?int _trunkHash;
?? ?int _dataOffset;
?? ?int _compressSize;
?? ?int _realSize;
?? ?int _unknown1;
?? ?int _unknonw2;
?? ?int _compressType;
};
std::string GetNpkFileName(char *pData, unsigned int maxLen)
{
?? ?std::string name;
?? ?for (int i = 0; i < maxLen; ++i)
?? ?{
?? ??? ?if ((pData[i] >= 'a' && pData[i] <= 'z')?
?? ??? ??? ?|| (pData[i] >= 'A' && pData[i] <= 'Z') )
?? ??? ?{
?? ??? ??? ?name += pData[i];
?? ??? ?}
?? ?}
?? ?return name;
}
?
int _tmain(int argc, _TCHAR* argv[])
{
?? ?if (argc < 2)
?? ?{
?? ??? ?printf("%s npkFile\n", argv[0]);
?? ??? ?return 0;
?? ?}
?? ?FILE *fp = fopen(argv[1], "rb");
?? ?if (!fp)
?? ?{
?? ??? ?return 0;
?? ?}
?? ?unsigned int nFileLen = 0;
?? ?fseek(fp,0,SEEK_END); //定位到文件末
?? ?nFileLen = ftell(fp); //文件長度?
?
?? ?fseek(fp,0,SEEK_SET);
?
?? ?st_NpkHeader npkHeader;
?? ?fread(&npkHeader, sizeof(npkHeader), 1, fp);
?? ?if (npkHeader._magic != 0x4b50584e)
?? ?{
?? ??? ?printf("not npk file\n");
?? ??? ?return 0;
?? ?}
?? ?fseek(fp,0,SEEK_SET);
?
?? ?st_NpkTrunk* pNpkTrunkList = new st_NpkTrunk[npkHeader._count];
?? ?std::string strDir = "./Dump";
?? ?if (_access(strDir.c_str(), 0) != 0)
?? ?{
?? ??? ?_mkdir(strDir.c_str());
?? ?}
?? ?fseek(fp, npkHeader._offset,SEEK_SET);
?? ?int nRSize = fread(pNpkTrunkList, sizeof(st_NpkTrunk), npkHeader._count, fp);
?? ?for (int i = 0; i < nRSize; ++i)
?? ?{
?? ??? ?fseek(fp, pNpkTrunkList[i]._dataOffset, SEEK_SET);
?? ??? ?char *pSrc = new char[pNpkTrunkList[i]._compressSize];?? ??? ?
?? ??? ?fread(pSrc, pNpkTrunkList[i]._compressSize, 1, fp);
?? ??? ?char *pDst = new char[pNpkTrunkList[i]._realSize];
?? ??? ?if (pNpkTrunkList[i]._compressType == 2)
?? ??? ?{
?? ??? ??? ?LZ4_decompress_safe(pSrc, pDst, pNpkTrunkList[i]._compressSize, pNpkTrunkList[i]._realSize);
?? ??? ?}
?? ??? ?else if (pNpkTrunkList[i]._compressType == 1)
?? ??? ?{
?? ??? ??? ?int realSize = pNpkTrunkList[i]._realSize;
?? ??? ??? ?int nRet = uncompress((Bytef *)pDst, (uLongf*)&realSize, (Bytef *)pSrc, pNpkTrunkList[i]._compressSize);
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?memcpy(pDst, pSrc, pNpkTrunkList[i]._realSize);
?? ??? ?}?? ??? ?
?? ??? ?char fileName[126];?? ??? ?
?? ??? ?std::string format = GetNpkFileName(pDst, 5);?? ?
?? ??? ?sprintf_s<126>(fileName, "%s/%x.%s", strDir.c_str(), pNpkTrunkList[i]._trunkHash, format.c_str());
?? ??? ?FILE *fp2 = fopen(fileName, "wb");
?? ??? ?fwrite(pDst, pNpkTrunkList[i]._realSize, 1, fp2);
?? ??? ?fclose(fp2);
?
?? ??? ?delete[] pSrc;
?? ??? ?delete[] pDst;
?? ?}
?? ?return 0;
}

總結

以上是生活随笔為你收集整理的游戏 Npk文件解压的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。