C# 结构c中的安全固定大小数组#
我在一个大约1000个元素的嵌入式MCU中有一个C结构,其中包含许多固定大小的数组和其他结构,现在我想用C将数据带到PC上# 下面是我的C结构元素的简单预览C# 结构c中的安全固定大小数组#,c#,arrays,struct,C#,Arrays,Struct,我在一个大约1000个元素的嵌入式MCU中有一个C结构,其中包含许多固定大小的数组和其他结构,现在我想用C将数据带到PC上# 下面是我的C结构元素的简单预览 struct _registers { char name[32]; float calibrate[4][16]; float DMTI; float DMTII; float DMTIII; float DMTIE; float DMTIIE; .... }; 现在我想使
struct _registers
{
char name[32];
float calibrate[4][16];
float DMTI;
float DMTII;
float DMTIII;
float DMTIE;
float DMTIIE;
....
};
现在我想使用GCHandle类将结构转换为C#
像这样的
//The C struct is in this byte array named buffer
byte[] buffer = new byte[4096];
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
_registers stuff = (protection_registers)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),typeof(_registers));
handle.Free();
[StructLayout(LayoutKind.Explicit, Size = 56, Pack = 1)]
public struct NewStuff
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
[FieldOffset(0)]
public string name;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(32)]
public float calibrate[4][16];
}
问题是Visual studio抱怨“指针和固定大小的缓冲区只能在不安全的上下文中使用”
有没有办法在没有不安全代码的情况下正常使用它?我发现做这样的事情
//The C struct is in this byte array named buffer
byte[] buffer = new byte[4096];
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
_registers stuff = (protection_registers)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),typeof(_registers));
handle.Free();
[StructLayout(LayoutKind.Explicit, Size = 56, Pack = 1)]
public struct NewStuff
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
[FieldOffset(0)]
public string name;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(32)]
public float calibrate[4][16];
}
但是,随着MCU上的代码在未来几年的发展,我们将向结构添加许多功能和参数,而且由于结构已经有1000个元素,我们如何以更聪明的方式更好地完成它?因为跟踪所有偏移非常困难,而且容易出错 > P>尝试这样做,而不是(注意:使用<代码>类<代码> >代替
SizeConst
,因为编组需要知道这一点
此外,初始化类时,需要将数组字段设置为适当大小的缓冲区,并使用正确的缓冲区大小初始化StringBuilder
这样做意味着您可以避免使用
固定的
缓冲区(因此,您可以避免不安全的
代码)。标签垃圾邮件是不好的网络礼仪只要您正确定义了所有字段的大小(您正在这样做),您就不需要指定FieldOffset
。如果有1000个元素,则不应将\u寄存器
声明为结构
。将其声明为类
。否则,每个分配将创建一个新的\u寄存器
副本。C++中的代码>类<代码> >代码>结构>代码>与C代码中的<>代码>类<代码> >代码>结构>代码不一样。有没有办法去除siz?谢谢,你能给我一个狙击代码吗?[字段偏移]不是不安全的。他的代码片段很糟糕,缺少fixed
关键字。需要进行编译。固定大小的缓冲区是不安全的,未检查对它们进行索引。@HansPassant是的,我删除了关于FieldOffset的评论。我记错了以前的一次讨论——当然,那从未发生过。。。