1+ // 文件使用UTF-8编码,解决代码页936问题
12#define _CRT_SECURE_NO_WARNINGS
23#include < string>
34#include < vector>
@@ -146,12 +147,6 @@ class AssetBundleProcessor
146147 // 解压数据
147148 std::vector<uint8_t > DecompressData (const std::vector<uint8_t >& data, UnityCompressionType compressionType);
148149
149- // 计算数据哈希值
150- uint64_t ComputeHash (const std::vector<uint8_t >& data);
151-
152- // 计算CRC校验和
153- uint32_t CalculateCRC (const std::vector<uint8_t >& data);
154-
155150 // LZMA压缩/解压
156151 std::vector<uint8_t > CompressLZMA (const std::vector<uint8_t >& data);
157152 std::vector<uint8_t > DecompressLZMA (const std::vector<uint8_t >& data);
@@ -296,8 +291,12 @@ EXPORT_API const char** ExtractAssetBundle(
296291 // 分配内存存储文件路径
297292 char ** result = new char *[extractedFiles.size ()];
298293 for (size_t i = 0 ; i < extractedFiles.size (); ++i) {
299- result[i] = new char [extractedFiles[i].length () + 1 ];
300- std::strcpy (result[i], extractedFiles[i].c_str ());
294+ // 确保分配足够的内存空间,包括字符串结束符
295+ size_t len = extractedFiles[i].length ();
296+ result[i] = new char [len + 1 ];
297+ // 安全地复制字符串
298+ strncpy (result[i], extractedFiles[i].c_str (), len);
299+ result[i][len] = ' \0 ' ; // 确保字符串正确终止
301300 }
302301
303302 *resultLength = static_cast <int >(extractedFiles.size ());
@@ -322,8 +321,18 @@ EXPORT_API void GetExtractedFiles(
322321 }
323322
324323 for (int i = 0 ; i < resultLength; ++i) {
325- if (resultPtr[i]) {
326- std::strcpy (result[i], resultPtr[i]);
324+ if (resultPtr[i] && result[i]) { // 确保源和目标指针都有效
325+ // 获取源字符串长度
326+ size_t len = strlen (resultPtr[i]);
327+ // 假设result[i]已经分配了足够的内存
328+ // 使用安全的字符串复制函数,确保不会超出目标缓冲区
329+ // 注意:这里假设result[i]的大小至少为len+1
330+ if (len > 0 ) {
331+ memcpy (result[i], resultPtr[i], len);
332+ result[i][len] = ' \0 ' ; // 确保字符串正确终止
333+ } else {
334+ result[i][0 ] = ' \0 ' ; // 空字符串情况
335+ }
327336 }
328337 }
329338}
@@ -687,7 +696,7 @@ std::string AssetBundleProcessor::CreateAssetBundle(const std::string& bundleNam
687696 header.FileSize = header.HeaderSize + header.BlocksInfoSize + compressedData.size ();
688697
689698 // 计算未压缩数据哈希
690- header.UncompressedDataHash = ComputeHash (fileData);
699+ header.UncompressedDataHash = CalculateHash (fileData);
691700
692701 // 序列化头部
693702 std::vector<uint8_t > headerData = header.SerializeHeader ();
@@ -725,7 +734,7 @@ std::string AssetBundleProcessor::CreateAssetBundle(const std::string& bundleNam
725734
726735 std::vector<uint8_t > fileContent (header.FileSize );
727736 inputFile.read (reinterpret_cast <char *>(fileContent.data ()), fileContent.size ());
728- header.CRC = CalculateCRC (fileContent);
737+ header.CRC = CalculateCRC32 (fileContent);
729738 inputFile.close ();
730739
731740 // 更新CRC
@@ -1070,4 +1079,33 @@ uint64_t AssetBundleProcessor::CalculateHash(const std::vector<uint8_t>& data) {
10701079 }
10711080
10721081 return hash;
1082+ }
1083+
1084+ // 压缩数据 - 根据压缩类型选择合适的压缩方法
1085+ std::vector<uint8_t > AssetBundleProcessor::CompressData (const std::vector<uint8_t >& data, UnityCompressionType compressionType) {
1086+ switch (compressionType) {
1087+ case UnityCompressionType::LZMA:
1088+ return CompressLZMA (data);
1089+ case UnityCompressionType::LZ4:
1090+ return CompressLZ4 (data);
1091+ case UnityCompressionType::LZ4HC:
1092+ return CompressLZ4HC (data);
1093+ case UnityCompressionType::None:
1094+ default :
1095+ return data;
1096+ }
1097+ }
1098+
1099+ // 解压数据 - 根据压缩类型选择合适的解压方法
1100+ std::vector<uint8_t > AssetBundleProcessor::DecompressData (const std::vector<uint8_t >& data, UnityCompressionType compressionType) {
1101+ switch (compressionType) {
1102+ case UnityCompressionType::LZMA:
1103+ return DecompressLZMA (data);
1104+ case UnityCompressionType::LZ4:
1105+ case UnityCompressionType::LZ4HC:
1106+ return DecompressLZ4 (data);
1107+ case UnityCompressionType::None:
1108+ default :
1109+ return data;
1110+ }
10731111}
0 commit comments