将ByValTStr编组为UTF8

问题描述 投票:1回答:1

我正在使用C DLL,在使用P / Invoke编组字符串时遇到麻烦。

DLL具有如下结构:

typedef struct
{
    char sAddress[256];
    BYTE byUseRtsp;
    WORD wPort;
}INFO,*LPINFO;

我的C#结构看起来像这样:

[StructLayout(LayoutKind.Sequential)]
public struct INFO
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    public string sAddress;

    public byte byUseRtsp;

    public short wPort;
}

sAddress的字符串编组处理ASCII文本,但是DLL始终使用UTF-8编码。因此,一旦使用了多字节字符,编组就会使文本乱码。使用CharSet.Unicode在这里不起作用,因为这会告诉编组在Windows上将字符串编码/解码为UTF-16。我需要一个CharSet.Utf8,很不幸,它不存在。

I do有一种解决方法,但是它很丑,如果可能的话,请避免使用。解决方法是替换:

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    public string sAddress;

with:

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    public byte[] sAddress;

然后重新编写代码,以使用Encoding.UTF8.GetBytes/String()方法获取字符串值。我还需要使用此方法自己处理空终止符。

是否有更好的方法?

c# utf-8 pinvoke
1个回答
1
投票

是否有更好的方法?

使用内置选项将您所做的工作编组起来可能和它一样好。您可能想编写一些辅助方法来为您管理此操作,但是我敢肯定您对此还活着。

除此之外,您还可以使用自定义封送处理程序。我不知道在此主题上有大量工作要做。一个更完整的碰巧是我的这个问题:How do I write a custom marshaler which allows data to flow from native to managed?

© www.soinside.com 2019 - 2024. All rights reserved.