如何使用 Il2CppInspector 在 C++ 中将 std::string 转换为 System.String?
How do I convert a std::string to System.String in C++ with Il2CppInspector?
我正在使用 Il2CppInspector 为 Unity 游戏生成脚手架。我可以使用下面提供的函数将 System.String
(Il2CppInspector 中的 app::String
)转换为 std::string
。
我将如何逆转这个过程;如何将 std::string
转换为 System.String
?
helpers.cpp
// Helper function to convert Il2CppString to std::string
std::string il2cppi_to_string(Il2CppString* str) {
std::u16string u16(reinterpret_cast<const char16_t*>(str->chars));
return std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(u16);
}
// Helper function to convert System.String to std::string
std::string il2cppi_to_string(app::String* str) {
return il2cppi_to_string(reinterpret_cast<Il2CppString*>(str));
}
简而言之,我正在寻找一个接受 std::string
和 returns 以及 app::String
的函数
// Helper function to convert std::string to System.String
app::String string_to_il2cppi(std::string str) {
// Conversion code here
}
使用所有命名空间导出 Il2CppInspector,这将使您能够访问 Marshal_PtrToStringAnsi
。
app::String* string_to_il2cppi(std::string str) {
return app::Marshal_PtrToStringAnsi((void*)&str, NULL);
}
限制:不要尝试转换其中包含空终止符的字符串示例:
std::string test = "Hello[=11=]world";
如果这对您来说是个问题,请使用 BullyWiiPlaza 的解决方案。
接受的答案实际上是错误的,根据 MSDN documentation.
,没有大小参数并且复制在第一个空字节 (0x00
) 处停止
以下代码修复了这些问题并正常工作:
app::String* string_to_il2cppi(const std::string& string)
{
const auto encoding = (*app::Encoding__TypeInfo)->static_fields->utf8Encoding;
const auto managed_string = app::String_CreateStringFromEncoding((uint8_t*)&string.at(0), string.size(), encoding, nullptr);
return managed_string;
}
To create a string, you cannot use System.String‘s constructors –
these are redirected to icalls that throw exceptions. Instead, you
should use the internal Mono function String.CreateString. This
function has many overloads accepting various types of pointer and
array; an easy one to use accepts a uint16_t* to a Unicode string and
can be called as follows [...]
我正在使用 Il2CppInspector 为 Unity 游戏生成脚手架。我可以使用下面提供的函数将 System.String
(Il2CppInspector 中的 app::String
)转换为 std::string
。
我将如何逆转这个过程;如何将 std::string
转换为 System.String
?
helpers.cpp
// Helper function to convert Il2CppString to std::string
std::string il2cppi_to_string(Il2CppString* str) {
std::u16string u16(reinterpret_cast<const char16_t*>(str->chars));
return std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(u16);
}
// Helper function to convert System.String to std::string
std::string il2cppi_to_string(app::String* str) {
return il2cppi_to_string(reinterpret_cast<Il2CppString*>(str));
}
简而言之,我正在寻找一个接受 std::string
和 returns 以及 app::String
// Helper function to convert std::string to System.String
app::String string_to_il2cppi(std::string str) {
// Conversion code here
}
使用所有命名空间导出 Il2CppInspector,这将使您能够访问 Marshal_PtrToStringAnsi
。
app::String* string_to_il2cppi(std::string str) {
return app::Marshal_PtrToStringAnsi((void*)&str, NULL);
}
限制:不要尝试转换其中包含空终止符的字符串示例:
std::string test = "Hello[=11=]world";
如果这对您来说是个问题,请使用 BullyWiiPlaza 的解决方案。
接受的答案实际上是错误的,根据 MSDN documentation.
,没有大小参数并且复制在第一个空字节 (0x00
) 处停止
以下代码修复了这些问题并正常工作:
app::String* string_to_il2cppi(const std::string& string)
{
const auto encoding = (*app::Encoding__TypeInfo)->static_fields->utf8Encoding;
const auto managed_string = app::String_CreateStringFromEncoding((uint8_t*)&string.at(0), string.size(), encoding, nullptr);
return managed_string;
}
To create a string, you cannot use System.String‘s constructors – these are redirected to icalls that throw exceptions. Instead, you should use the internal Mono function String.CreateString. This function has many overloads accepting various types of pointer and array; an easy one to use accepts a uint16_t* to a Unicode string and can be called as follows [...]