Skip to content

Commit ae772af

Browse files
committed
refactor(Native): 更新依赖库并优化字符串处理逻辑
将liblzma.lib替换为liblzma_static.lib以使用静态链接版本。优化字符串复制逻辑,确保内存分配和字符串终止符的正确性。移除未使用的哈希和CRC计算函数,增加UTF-8编码声明以解决代码页问题。
1 parent a50e9c1 commit ae772af

2 files changed

Lines changed: 53 additions & 15 deletions

File tree

src/Native/ABProcessorNative.vcxproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130
<SubSystem>Windows</SubSystem>
131131
<GenerateDebugInformation>true</GenerateDebugInformation>
132132
<EnableUAC>false</EnableUAC>
133-
<AdditionalDependencies>lz4.lib;liblzma.lib;libcrypto.lib;libssl.lib;%(AdditionalDependencies)</AdditionalDependencies>
133+
<AdditionalDependencies>lz4.lib;liblzma_static.lib;libcrypto.lib;libssl.lib;%(AdditionalDependencies)</AdditionalDependencies>
134134
</Link>
135135
<PostBuildEvent>
136136
<Command>xcopy /y /d "D:\vcpkg\installed\x64-windows\bin\*.dll" "$(OutDir)"</Command>
@@ -154,7 +154,7 @@
154154
<OptimizeReferences>true</OptimizeReferences>
155155
<GenerateDebugInformation>true</GenerateDebugInformation>
156156
<EnableUAC>false</EnableUAC>
157-
<AdditionalDependencies>lz4.lib;liblzma.lib;libcrypto.lib;libssl.lib;%(AdditionalDependencies)</AdditionalDependencies>
157+
<AdditionalDependencies>lz4.lib;liblzma_static.lib;libcrypto.lib;libssl.lib;%(AdditionalDependencies)</AdditionalDependencies>
158158
</Link>
159159
<PostBuildEvent>
160160
<Command>xcopy /y /d "D:\vcpkg\installed\x64-windows\bin\*.dll" "$(OutDir)"</Command>
@@ -166,4 +166,4 @@
166166
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
167167
<ImportGroup Label="ExtensionTargets">
168168
</ImportGroup>
169-
</Project>
169+
</Project>

src/Native/src/ABProcessorNative.cpp

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
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

Comments
 (0)