带char的Marshall结构体
Marshall struct with char
当从c++到c#编组包含单个字符字段的结构时,c#结构的定义应该是什么样的?
[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++结构定义中声明为'char')
UPD:是否取决于c++库是用GCC还是VS(默认编译器选项)构建的?如果没有,我可以希望'char'在GCC和VS(默认编译器选项)上签名
在c++中,通常无法判断char
是有符号的还是无符号的。这取决于实现,通常可以通过选项配置单个编译器(实现),使其成为任意一种方式。
,即使用signed char
或unsigned char
。然后,您可以根据需要选择sbyte
或byte
进行c#编组。
在Visual Studio和GCC中,char
是默认签名的。/J编译器选项(GCC为-funsigned-char
)可用于使其无符号。
因此,答案取决于该选项是否在您的c++项目中使用。
答案取决于您喜欢如何在c#中存储值。你应该选择最方便的。
- 如果你把它作为无符号值存储在c#变量中,那么把它封送为
UnmanagedType.U1
。 - 如果你把它作为一个有符号的值存储在c#变量中,那么把它封送为
UnmanagedType.I1
。
关键在于,一旦字节越过模块边界,重要的是位表示,而不是c#代码中的逻辑表示。在c++代码中,无符号值255相当于有符号值-1。
当然,这假设您使用char
作为字符类型。在问题的注释中,您声明将其用作整数类型,在这种情况下,您需要决定是否对其进行signed和封送。
相关文章:
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 包含 std::list 的结构体的 C++ 初始化
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何使用结构体的向量数组?
- 如何使用结构体在C++中更改这些代码?
- 无法在 Mosquitto MQTT Broker 插件上访问结构体 mosquitto 的元素
- 我应该如何在C++中使用结构体解决输入失败的问题?
- Qsort() 比较结构体整数的总和
- 如何使用迭代器指向结构体c++的向量
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- 如何获取结构体成员的地址
- 创建结构体向量,表达式:向量下标超出范围
- boost::任何带有结构体和无符号整数
- 如何在构造函数中初始化结构体的动态数组?
- 只写结构体的某些字段
- C++ push_back() 一个结构体到一个向量中
- C++14 结构体上的统一初始化
- 带char的Marshall结构体