当编组包含从C ++到C#的单个char字段的struct时,C#struct定义应该是什么样的?
[StructLayout(LayoutKind.Sequential, Size = 1), Serializable]
public struct SomeStruct
{
[MarshalAs(UnmanagedType.I1)]
public sbyte Field;
}
或
[StructLayout(LayoutKind.Sequential, Size = 1), Serializable]
public struct SomeStruct
{
[MarshalAs(UnmanagedType.U1)]
public byte Field;
}
我无法找到有关它是否为有符号字节的明确信息。 (它在C ++ struct definition中声明为'char')
UPD:这取决于C ++ lib是用GCC还是VS(默认编译器选项)构建的?如果没有,我可以希望在GCC和VS(默认编译器选项)上签署'char'
答案 0 :(得分:3)
在Visual Studio和GCC中,char
为signed by default。 /J编译器选项(GCC的-funsigned-char
)可用于使其无符号。
所以答案取决于你的C ++项目中是否使用了该选项。
答案 1 :(得分:3)
通常,您无法判断{C}中char
是否已签名或未签名。它取决于实现,并且通常可以通过选项配置单个编译器(实现)以使其成为任何一种方式。
最好的选择是尽可能在C ++代码中明确说明,即使用signed char
或unsigned char
。然后,您可以根据需要选择sbyte
或byte
进行C#编组。
答案 2 :(得分:1)
答案取决于您希望如何将值存储在C#中。你应该选择最方便的。
UnmanagedType.U1
。UnmanagedType.I1
。关键是,一旦该字节越过模块边界,它就是重要的按位表示,而不是C#代码中的逻辑表示。一旦达到C ++代码,无符号值255就相当于有符号值-1。
当然,这假设您使用char
作为字符类型。在对该问题的评论中,您声明您将其用作整数类型,在这种情况下,您需要决定是否对其进行签名并进行相应的编组。