由于编码问题,在iOS上从c#调用DLL库
本文关键字:上从 iOS 调用 DLL 于编码 编码 问题 | 更新日期: 2023-09-27 18:13:48
我有一个特殊的问题。我用Xamarin。并尝试调用一个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中,你可以用一个buff的字符串来调用这个函数,比如"a=2",然后在Lua中被编译成二进制代码。但是你也可以用二进制块(预编译块)调用这个函数。
现在我的问题是,字符串工作完美。但是二进制块的转换是错误的。我必须将字节数组转换为字符串,该字符串在c#中以UTF-16编码。如果我调用这个函数,这个"字符串"将从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 000,这显然是错误的。这是因为UTF-16 D6在UTF-8 C3 96中,并且在调用函数时被更改。
结束时,我应该如何定义/调用函数,使这种转换不会发生?使用编码。Ansi或Encoding。
使用。net可以创建两个托管方法(重载或通过更改DllImport
属性使用不同的名称),它们指向相同的本机函数。
第一个将使用string
参数。这是你已经有的。
第二个将使用byte[]
参数。这将确保数据在转换为本机之前不被解码(和修改)。比如:
[DllImport(LIBNAME,CallingConvention=CallingConvention.Cdecl)]
public static extern int luaL_loadbuffer(IntPtr luaState,
byte[] buff,
uint size,
string name);