Marshal NOT 0终止的字符串

Marshal NOT 0 terminated string

本文关键字:字符串 终止 NOT Marshal      更新时间:2023-10-16

我有以下非托管结构。

struct MyNativeStruct_Foo
{   
 char product_name[4];
 char product_model[2];
}

以及管理的等效

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct MyManagedStruct_Foo
{
    [MarshalAs(UnmanagedType.LPStr, SizeConst = 4)]
    public string product_name;
    [MarshalAs(UnmanagedType.LPStr, SizeConst = 2)]
    public string product_model;
}

不幸的是,刺痛并没有以null终止。将使用产品名称的所有4个字符。如果我用"LPStr"定义托管结构,则字符串必须以0结尾。

有没有其他方法可以定义托管结构?是否可以定义自定义Marshaller属性?或者你还有其他想法吗?

注释;无法更改本机结构。

感谢

Amberg

[编辑]更改为LPStr(评论Jason Larke)

您可以更改编组,将字符串视为固定大小的bytess数组,然后使用Encoding类将字节转换为托管字符串。

[StructLayout(LayoutKind.Sequential)]
public struct MyManagedStruct_Foo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]
    public byte[] product_name;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=2)]
    public byte[] product_model;
    public string GetProductName()
    {
        return System.Text.Encoding.ASCII.GetString(this.product_name);
    }
    public string GetProductModel()
    {
        return System.Text.Encoding.ASCII.GetString(this.product_model);
    }
}

不完全是世界上最性感的结构,但它应该适合你的需求。