2

私には特別な問題があります。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 を使用しても機能しませんでした。

4

1 に答える 1