首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能在C#中正确编组UCS-4字符串?

为什么我不能在C#中正确编组UCS-4字符串?
EN

Stack Overflow用户
提问于 2020-10-04 01:33:55
回答 1查看 38关注 0票数 2

我试图在C#中封送一个hid_device_info结构,但我不知道如何将wchar_t*字符串转换为托管C#字符串。我尝试了MarshalAs属性中所有可能的值,但所有这些值都只返回第一个字符,没有返回其他字符。

我已经尝试用指针替换所有的宽字符串,这样我就可以手动查看它们,这就是我到目前为止所使用的结构:

代码语言:javascript
复制
public struct HidDeviceInfo
{
    public IntPtr path; // This one marshals fine because it's just a regular char_t*
    public ushort vendor_id;
    public ushort product_id;
    public IntPtr serial_number; // wchar_t*
    public ushort release_number;
    public IntPtr manufacturer_string; // wchar_t*
    public IntPtr product_string; // wchar_t*
    public ushort usage_page;
    public ushort usage;
    public int interface_number;
    public IntPtr next;
}

当我手动迭代其中一个指针(例如serial_number)时,我可以看到所有字符都有4个字节(1个ascii字节后面跟着3个0)。我尝试了所有可能的Marshal.PtrToString...方法,但没有一个方法能够检索完整的字符串。

我怀疑字符串被视为2字节字符,因为我不能在C#中指定字符宽度,这就是它在第一个字符后停止的原因。当然,通过了解这一点,我可以很容易地编写自己的字符串编组拆收器,但我觉得必须有一个现有的解决方案,而我忽略了一些显而易见的东西。

此结构来自P/Invoked函数和Marshal.PtrToStructure

代码语言:javascript
复制
[DllImport(LibUsbName, CharSet = CharSet.Unicode)]
public static extern IntPtr hid_enumerate(ushort vendorId, ushort productId);

我还尝试了所有可能的CharSet值。

这不可能是字符类型不匹配,就像在this question中一样,因为我已经尝试了不同字符类型的所有可能组合。

EN

回答 1

Stack Overflow用户

发布于 2020-10-04 02:38:27

我最终写了这个方法,它对我来说很好,但前提是所有字符都是ASCII,并且字符宽度保证为4个字节。

代码语言:javascript
复制
private static string ToUcs4String(this IntPtr ptr)
{
    var builder = new StringBuilder();
    var buffer = new byte[4];
    while (true)
    {
        Marshal.Copy(ptr, buffer, 0, 4);
        if (buffer[0] == 0)
            break;
        builder.Append((char) buffer[0]);
        ptr += 4;
    }

    return builder.ToString();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64187076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档