Marshal NOT 0终止的字符串
Marshal NOT 0 terminated string
我有以下非托管结构。
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)
您可以更改编组,将字符串视为固定大小的bytes
s数组,然后使用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++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 在字符串函数中抛出'char const*'实例后调用的终止
- 使用终止程序的指针在数组中输入字符串
- 如何告诉字符串流忽略null终止字符
- 当 NUL 字符被定义为字符串的一部分时,为什么 strlen() 不计算终止 NUL 字符的字节?
- 如何将非空终止字符串输出到 iostream,但保持格式
- 是否有一种安全的方法可以断言字符串视图是否以 null 终止?
- 自动截断和 null 终止缓冲区溢出中的字符串缓冲区
- 用户定义的字符串文字为字符串null终止
- 如何制作包含原始字符串终止符C++原始字符串
- 为什么具有单独字符的字符数组不像字符串文字那样以 null 终止符结尾?
- 字符串C :libc abi.dylib:终止未被发现的类型std :: out_of_range:basic
- 如何调整标准::字符串的大小以删除所有空终止符字符?
- 终止字符串的 '