Кодирование .Net Core StringBuilder на Mac

У меня есть следующая функция C:

LIBRARY_API HRESULT LA_CC GetRSAKeyPair(STRTYPE privateKeyPtr, STRTYPE publicKeyPtr)
{
int length = 2048;
string privateKey, publicKey;
if (GenerateRSAKeyPair(privateKey, publicKey) == false)
{
return FAIL;
}
#ifndef _WIN32
*privateKeyPtr = '\0'; // assumes `dest_size > 0`
strncat(privateKeyPtr, privateKey.c_str(), length);
*publicKeyPtr = '\0'; // assumes `dest_size > 0`
strncat(publicKeyPtr, publicKey.c_str(), length);
#else
*privateKeyPtr = L'\0'; // assumes `dest_size > 0`
wcsncat(privateKeyPtr, toUTF16(privateKey).c_str(), length);
*publicKeyPtr = L'\0'; // assumes `dest_size > 0`
wcsncat(publicKeyPtr, toUTF16(publicKey).c_str(), length);
#endif
return OK;
}

Он вызывается с помощью pinvoke:

[DllImport(DLL_FILE_NAME, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int GetRSAKeyPair(StringBuilder privateKey, StringBuilder publicKey);

И когда используется:

StringBuilder privateKey = new StringBuilder(2048);
StringBuilder publicKey = new StringBuilder(2048);
LibraryNative.GetRSAKeyPair(privateKey, publicKey);
Console.WriteLine(privateKey);
Console.WriteLine(publicKey);

Выходные данные возвращают данные на китайском языке, хотя тот же код отлично работает в Windows. Собственная библиотека предполагает, что кодировка не является utf-16 на платформе, отличной от Windows, но похоже, что stringbuilder ожидает и utf-16 в nix.

-1

Решение

Объяснение можно найти в условном коде в вашем C ++. Здесь вы решите использовать 8-битную кодировку на платформах, отличных от Windows, но использовать UTF16 в Windows. Код C #, с другой стороны, прямо заявляет, что текст является кодировкой UTF16, с использованием CharSet.Unicode, ,

Это несоответствие объясняет поведение, которое вы наблюдаете. Как это исправить? Что ж, вам нужно убедиться, что обе стороны интерфейса, управляемые и неуправляемые, используют одинаковую кодировку.

Ваша текущая стратегия использования другой кодировки для разных платформ, похоже, доставляет мне неприятности. Это просто приведет к путанице. Мой совет — выбрать одну кодировку для взаимодействия. Например, UTF16 будет хорошим выбором, который сделает взаимодействие максимально простым, потому что маршалер пинвока понимает его изначально.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]