gpt4 book ai didi

c# - 编码(marshal) NOT 0 终止字符串

转载 作者:太空狗 更新时间:2023-10-29 21:04:17 26 4
gpt4 key购买 nike

我有以下非托管结构。

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;
}

不幸的是,这些字符串不是空终止的。使用了产品名称的所有 4 个字符。如果我用“LPStr”定义托管结构,则字符串必须以 0 结尾。

是否有另一种方式来定义托管结构?可以定义自定义 Marshaller 属性吗?或者您有其他想法?

注意;无法更改 native 结构。

谢谢

琥珀色

[编辑]更改为 LPStr(注释 Jason Larke)

最佳答案

您可以更改编码以将字符串视为固定大小的 bytes 数组,然后使用 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);
}
}

不完全是世界上最性感的结构,但它应该可以满足您的需求。

关于c# - 编码(marshal) NOT 0 终止字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11556852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com