私には特別な問題があります。Xamarin.iOS を使用して、DLL ライブラリの関数を呼び出そうとしています。元の関数は次のように定義されます。
LUALIB_API int luaL_loadbuffer (lua_State *L,
const char *buff,
size_t size,
const char *name)
としてC#にインポートされます
[CLSCompliant (false)]
[DllImport(LIBNAME,CallingConvention=CallingConvention.Cdecl)]
public static extern int luaL_loadbuffer(IntPtr luaState,
string buff,
uint size,
string name);
ご覧のとおり、ライブラリは Lua 5.1 で、C# 側はライブラリのラッパーである KeraLua です。Lua からは、"a=2" のように buff で文字列を指定してこの関数を呼び出すことができます。これは、Lua のバイナリ コードにコンパイルされます。ただし、バイナリ チャンク (プリコンパイル済みチャンク) を buff に指定してこの関数を呼び出すこともできます。buff はバイト配列です。
今私の問題は、文字列が完璧に機能することです。しかし、バイナリ チャンクは正しく変換されません。バイト配列を、UTF-16 でエンコードされた C# の文字列に変換する必要がありました。関数を呼び出すと、この「文字列」は UTF-16 から UTF-8 に変換されます。buff にテキストが含まれている場合、これは問題ありませんが、バイナリ データでは結果が間違っています。
例: バイナリ データの整数。バイト配列では D6 21 00 00 として表示され、文字列に変換されます。
StringBuilder s = new StringBuilder();
foreach (byte b in byteArray)
s.Append((char)b);
結果は D6 21 00 00 になります。関数を呼び出してライブラリ C3 96 21 00 00 を取得するよりも、これは明らかに間違っています。これは、UTF-16 D6 が UTF-8 C3 96 であり、関数の呼び出し中に変更されるためです。
最後に、この変換が発生しないように、関数をどのように定義/呼び出す必要がありますか? Encoding.Ansi または Encoding.ASCII を使用しても機能しませんでした。