U++第三方库导入
场景
给UE5.3接入一个API需要使用MD5加密算法,因此尝试将FString直接拿来加密。
遇见问题1
编码前(字符串):{"siteId":"taian","siteModelId":"laojie","poiName":"test-poi","posX":50,"posY":1,"posZ":50}
编码后: 5df94285a149d46e47803c7858e0ec04
期望结果:ee604b6a1ad8fe40a5f98dc86cedbcd6
尝试解决
我觉得问题应该出于:FString是utf16编码,所以它也是基于utf16编码格式,我尝试直接使用此加密算法并调整编码格式到utf8但还是出现了诡异问题,结果是我得到的输出结果和api提供方的预期结果完全不同。
那么尝试直接用UE的MD5算法进行加密,而不进行utf16->utf8的格式转换
遇到问题2
生成开始于 11:12...
1>------ 已启动生成: 项目: SeaAPI, 配置: Development_Editor x64 ------
1>Using bundled DotNet SDK version: 6.0.302
1>Running UnrealBuildTool: dotnet "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" SeaAPIEditor Win64 Development -Project="D:\YangHao\UE5.3\SeaAPI\SeaAPI.uproject" -WaitMutex -FromMsBuild
1>Log file: C:\Users\Administrator\AppData\Local\UnrealBuildTool\Log.txt
1>Total execution time: 0.48 seconds
1>Unable to delete hot-reload file: D:\YangHao\UE5.3\SeaAPI\Binaries\Win64\UnrealEditor-SeaAPI-0001.dll
1>D:\MicrosoftVisualStudio\vs2022\MSBuild\Microsoft\VC\v170\Microsoft.MakeFile.Targets(44,5): error MSB3073: 命令“"C:\Program Files\Epic Games\UE_5.3\Engine\Build\BatchFiles\Build.bat" SeaAPIEditor Win64 Development -Project="D:\YangHao\UE5.3\SeaAPI\SeaAPI.uproject" -WaitMutex -FromMsBuild”已退出,代码为 6。
1>已完成生成项目“SeaAPI.vcxproj”的操作 - 失败。
========== 生成: 0 成功,1 失败,10 最新,0 已跳过 ==========
========== 生成 于 11:12 完成,耗时 00.919 秒 ==========
尝试方案
UBT出问题,不是代码问题,那估计就是预编译之类的问题了,那就关了重新编译一下。果然再次打开就编译成功了。
md5加密结果:45d69749eb4b82db1c5e5c9cae47ff14
就是加密后的结果对不上。
思考原因
会不会md5算法有很多种是md5加密算法有不同呢?又或者UE提供的接口进行utf16->utf8->加密->utf16的数据格式转换过程中有信息错乱呢?如果是哪有问题出在那一步呢?
验证猜测
下载hashlibcpp这个项目的代码,切实去跑一下这个样例,结果符合期望,说明至少是思考的原因中的问题。
先完成任务,再思考原理
完成任务
- 在MyGame/Source/MyGame/下创建ThirdParty文件夹->MyGame/Source/MyGame/ThirdParty
- 将Hashlib的文件拖出来,反正我只需要md5.h和md5.cpp。
- AI建议我分别存放.h我呢见和.cpp,我同意了。于是有目录结构
D:\YangHao\UE5.3\SeaAPI\Source\SeaAPI>tree
卷 新加卷 的文件夹 PATH 列表
卷序列号为 A6CC-5A6F
D:.
├─BPLib
└─ThirdParty
└─Hashlib
├─include
└─src
搭建了如图的目录结构,include里全是.h,src中全是.cpp。初学阶段就尽量听他的了。
之后编写Build.cs文件,
// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.IO;
using UnrealBuildTool;
public class SeaAPI : ModuleRules
{
public SeaAPI(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { });
//添加第三方库,ModuleDirectory就是Game/ProjectName/Source/ProjectName
string ThirdPartyPath = Path.Combine(ModuleDirectory, "ThirdParty");
PublicIncludePaths.AddRange(new string[]
{
Path.Combine(ThirdPartyPath, "Hashlib", "include")
});
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}
ModuleDirectory就是就是Source下和.uproject同名的文件夹。
这样导入路径就可以索引到Hashlib/include了(需要在文件夹里能找到这样的路径)然后生成,结果导入报错了。那就对了,推出VS后再重新编译项目,完了后打开。(因为不知道要重新打开和重新编译,这一步折腾好久,看了不少文档,还是问了免费的claude才明白,感谢claude,等我有钱一定支持你一下。前提,我有钱)

写了一个原生CPP样例,结果得到的结果是期待中的。然后将他拿到UE中用FString转换成utf8:得到的结果是不对应:5df94285a149d46e47803c7858e0ec04。说明问题在编码格式上。
欸?原来是我粘过来的字符串被UE自动去掉了连字符导致编码结果不一样。

浙公网安备 33010602011771号