由于编码问题,在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。

由于编码问题,在iOS上从c#调用DLL库

使用。net可以创建两个托管方法(重载或通过更改DllImport属性使用不同的名称),它们指向相同的本机函数。

第一个将使用string参数。这是你已经有的。

第二个将使用byte[]参数。这将确保数据在转换为本机之前不被解码(和修改)。比如:

[DllImport(LIBNAME,CallingConvention=CallingConvention.Cdecl)]
public static extern int luaL_loadbuffer(IntPtr luaState, 
                                     byte[] buff, 
                                     uint size, 
                                     string name);