Răsfoiți Sursa

添加将 md5 转换到字符串的函数

akemimadoka 7 ani în urmă
părinte
comite
54b62cc43a

+ 6 - 0
YumeBot.Test/CryptographyTest.cpp

@@ -2,6 +2,7 @@
 #include <Cryptography.h>
 #include <Cryptography.h>
 
 
 using namespace YumeBot;
 using namespace YumeBot;
+using namespace NatsuLib;
 
 
 TEST_CASE("Cryptography", "[Utility][Cryptography]")
 TEST_CASE("Cryptography", "[Utility][Cryptography]")
 {
 {
@@ -39,6 +40,11 @@ TEST_CASE("Cryptography", "[Utility][Cryptography]")
 		Calculate(Utility::ToByteSpan(test).subspan(0, std::size(test) - 1), result);
 		Calculate(Utility::ToByteSpan(test).subspan(0, std::size(test) - 1), result);
 
 
 		constexpr const std::uint8_t expectedResult[] = "\x09\x8f\x6b\xcd\x46\x21\xd3\x73\xca\xde\x4e\x83\x26\x27\xb4\xf6";
 		constexpr const std::uint8_t expectedResult[] = "\x09\x8f\x6b\xcd\x46\x21\xd3\x73\xca\xde\x4e\x83\x26\x27\xb4\xf6";
+		constexpr const auto expectedResultStr = u8"098f6bcd4621d373cade4e832627b4f6"_nv;
 		REQUIRE(std::memcmp(result, expectedResult, std::size(result)) == 0);
 		REQUIRE(std::memcmp(result, expectedResult, std::size(result)) == 0);
+		Md5ToHexString(result, [&](const char* begin, const char* end)
+		{
+			REQUIRE(nStrView{ begin, end } == expectedResultStr);
+		});
 	}
 	}
 }
 }

+ 28 - 14
YumeBot.Test/JceTest.cpp

@@ -47,11 +47,17 @@ TEST_CASE("Jce", "[Jce]")
 
 
 		OldUniAttribute uniAttribute{};
 		OldUniAttribute uniAttribute{};
 
 
-		uniAttribute.Put(u8"SomeInt"_ns, 1);
-		CHECK(uniAttribute.Get<std::int32_t>(u8"SomeInt"_ns) == 1);
-
-		uniAttribute.Put(u8"SomeFloat"_ns, 1.0f);
-		CHECK(uniAttribute.Get<float>(u8"SomeFloat"_ns) == 1.0f);
+		{
+			uniAttribute.Put(u8"SomeInt"_ns, 1);
+			std::int32_t intValue;
+			REQUIRE(uniAttribute.Get(u8"SomeInt"_ns, intValue));
+			CHECK(intValue == 1);
+
+			uniAttribute.Put(u8"SomeFloat"_ns, 1.0f);
+			float floatValue;
+			REQUIRE(uniAttribute.Get(u8"SomeFloat"_ns, floatValue));
+			CHECK(floatValue == 1.0f);
+		}
 
 
 		const auto memoryStream = make_ref<natMemoryStream>(0, true, true, true);
 		const auto memoryStream = make_ref<natMemoryStream>(0, true, true, true);
 		uniAttribute.Encode(make_ref<natBinaryWriter>(memoryStream));
 		uniAttribute.Encode(make_ref<natBinaryWriter>(memoryStream));
@@ -62,8 +68,13 @@ TEST_CASE("Jce", "[Jce]")
 			OldUniAttribute readAttribute{};
 			OldUniAttribute readAttribute{};
 			readAttribute.Decode(make_ref<natBinaryReader>(memoryStream));
 			readAttribute.Decode(make_ref<natBinaryReader>(memoryStream));
 
 
-			CHECK(readAttribute.Get<std::int32_t>(u8"SomeInt"_ns) == 1);
-			CHECK(readAttribute.Get<float>(u8"SomeFloat"_ns) == 1.0f);
+			std::int32_t intValue;
+			REQUIRE(readAttribute.Get(u8"SomeInt"_ns, intValue));
+			CHECK(intValue == 1);
+
+			float floatValue;
+			REQUIRE(readAttribute.Get(u8"SomeFloat"_ns, floatValue));
+			CHECK(floatValue == 1.0f);
 		}
 		}
 	}
 	}
 
 
@@ -93,13 +104,16 @@ TEST_CASE("Jce", "[Jce]")
 			readPacket.Decode(make_ref<natBinaryReader>(memoryStream));
 			readPacket.Decode(make_ref<natBinaryReader>(memoryStream));
 
 
 			const auto& attribute = readPacket.GetAttribute();
 			const auto& attribute = readPacket.GetAttribute();
-			CHECK(attribute.Get<std::int32_t>(u8"SomeInt"_ns) == 1);
-
-			const auto ptr = attribute.Get<natRefPointer<JceTest>>(u8"JceTest"_ns);
-			REQUIRE(ptr);
-			CHECK(ptr->GetTestFloat() == 2.0f);
-			CHECK(ptr->GetTestInt() == 233);
-			CHECK(ptr->GetTestMap()[1] == 2.0f);
+			std::int32_t intValue;
+			REQUIRE(attribute.Get(u8"SomeInt"_ns, intValue));
+			CHECK(intValue == 1);
+
+			natRefPointer<JceTest> ptrValue;
+			REQUIRE(attribute.Get(u8"JceTest"_ns, ptrValue));
+			REQUIRE(ptrValue);
+			CHECK(ptrValue->GetTestFloat() == 2.0f);
+			CHECK(ptrValue->GetTestInt() == 233);
+			CHECK(ptrValue->GetTestMap()[1] == 2.0f);
 
 
 			const auto& requestPacket = readPacket.GetRequestPacket();
 			const auto& requestPacket = readPacket.GetRequestPacket();
 			CHECK(requestPacket.GetsFuncName() == u8"FuncName?"_nv);
 			CHECK(requestPacket.GetsFuncName() == u8"FuncName?"_nv);

+ 1 - 1
YumeBot/Cryptography.cpp

@@ -1,6 +1,6 @@
 #include "Cryptography.h"
 #include "Cryptography.h"
-#include <random>
 #include "Utility.h"
 #include "Utility.h"
+#include <random>
 #include <openssl/md5.h>
 #include <openssl/md5.h>
 
 
 #undef min
 #undef min

+ 16 - 0
YumeBot/Cryptography.h

@@ -5,6 +5,7 @@
 #include <natString.h>
 #include <natString.h>
 
 
 #include "Utility.h"
 #include "Utility.h"
+#include <charconv>
 
 
 namespace YumeBot::Cryptography
 namespace YumeBot::Cryptography
 {
 {
@@ -28,5 +29,20 @@ namespace YumeBot::Cryptography
 	namespace Md5
 	namespace Md5
 	{
 	{
 		void Calculate(gsl::span<const std::byte> const& input, gsl::span<std::byte, 16> const& output);
 		void Calculate(gsl::span<const std::byte> const& input, gsl::span<std::byte, 16> const& output);
+
+		template <typename Receiver>
+		decltype(auto) Md5ToHexString(gsl::span<const std::byte, 16> const& md5, Receiver&& receiver)
+		{
+			char result[32]{ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' };
+
+			for (std::size_t i = 0; i < 32; i += 2)
+			{
+				const auto value = static_cast<std::uint8_t>(md5[i / 2]);
+				const auto toCharResult = std::to_chars(result + i + (value <= 0x0F), result + i + 2, value, 16);
+				assert(toCharResult.ec == std::errc{});
+			}
+
+			return std::invoke(std::forward<Receiver>(receiver), std::cbegin(result), std::cend(result));
+		}
 	}
 	}
 }
 }

+ 3 - 10
YumeBot/Wup.h

@@ -75,8 +75,7 @@ namespace YumeBot::Jce::Wup
 		\
 		\
 		constexpr nStrView GetName(NatsuLib::natRefPointer<name> const&) noexcept\
 		constexpr nStrView GetName(NatsuLib::natRefPointer<name> const&) noexcept\
 		{\
 		{\
-			using namespace NatsuLib::StringLiterals;\
-			return u8 ## alias ## _nv;\
+			return GetName(ImplicitConvertibleIdentity<NatsuLib::natRefPointer<name>>);\
 		}
 		}
 
 
 #include "JceStructDef.h"
 #include "JceStructDef.h"
@@ -138,7 +137,7 @@ namespace YumeBot::Jce::Wup
 		}
 		}
 
 
 		template <typename T>
 		template <typename T>
-		T Get(nString const& name) const
+		bool Get(nString const& name, T& result) const
 		{
 		{
 			using namespace NatsuLib;
 			using namespace NatsuLib;
 
 
@@ -157,13 +156,7 @@ namespace YumeBot::Jce::Wup
 
 
 			JceInputStream in{ make_ref<natBinaryReader>(make_ref<natExternMemoryStream>(fieldIter->second.data(), fieldIter->second.size(), true)) };
 			JceInputStream in{ make_ref<natBinaryReader>(make_ref<natExternMemoryStream>(fieldIter->second.data(), fieldIter->second.size(), true)) };
 
 
-			T result;
-			if (!in.Read(0, result))
-			{
-				nat_Throw(natErrException, NatErr_InvalidArg, u8"Field of type {0} from key \"{1}\" is corrupted."_nv);
-			}
-
-			return result;
+			return in.Read(0, result);
 		}
 		}
 
 
 		bool Remove(nString const& name);
 		bool Remove(nString const& name);

+ 4 - 0
YumeBot/YumeBot.vcxproj

@@ -133,6 +133,7 @@
     </Lib>
     </Lib>
     <Lib>
     <Lib>
       <AdditionalLibraryDirectories>$(SolutionDir)Extern\NatsuLib\NatsuLib\bin\$(Platform)\$(Configuration);D:\OpenSSL-Win64\lib\VC\static;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalLibraryDirectories>$(SolutionDir)Extern\NatsuLib\NatsuLib\bin\$(Platform)\$(Configuration);D:\OpenSSL-Win64\lib\VC\static;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
     </Lib>
     </Lib>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -158,6 +159,7 @@
     </Lib>
     </Lib>
     <Lib>
     <Lib>
       <AdditionalLibraryDirectories>$(SolutionDir)Extern\NatsuLib\NatsuLib\bin\$(Platform)\$(Configuration);D:\OpenSSL-Win64\lib\VC\static;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalLibraryDirectories>$(SolutionDir)Extern\NatsuLib\NatsuLib\bin\$(Platform)\$(Configuration);D:\OpenSSL-Win64\lib\VC\static;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
     </Lib>
     </Lib>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -187,6 +189,7 @@
     </Lib>
     </Lib>
     <Lib>
     <Lib>
       <AdditionalLibraryDirectories>$(SolutionDir)Extern\NatsuLib\NatsuLib\bin\$(Platform)\$(Configuration);D:\OpenSSL-Win64\lib\VC\static;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalLibraryDirectories>$(SolutionDir)Extern\NatsuLib\NatsuLib\bin\$(Platform)\$(Configuration);D:\OpenSSL-Win64\lib\VC\static;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
     </Lib>
     </Lib>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -216,6 +219,7 @@
     </Lib>
     </Lib>
     <Lib>
     <Lib>
       <AdditionalLibraryDirectories>$(SolutionDir)Extern\NatsuLib\NatsuLib\bin\$(Platform)\$(Configuration);D:\OpenSSL-Win64\lib\VC\static;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalLibraryDirectories>$(SolutionDir)Extern\NatsuLib\NatsuLib\bin\$(Platform)\$(Configuration);D:\OpenSSL-Win64\lib\VC\static;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
     </Lib>
     </Lib>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />