Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 结构c中的安全固定大小数组#_C#_Arrays_Struct - Fatal编程技术网

C# 结构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; .... }; 现在我想使

我在一个大约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;
    ....
};
现在我想使用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>尝试这样做,而不是(注意:使用<代码>类<代码> >代替Stult,C++更适合C +结构):

您将无法删除
SizeConst
,因为编组需要知道这一点

此外,初始化类时,需要将数组字段设置为适当大小的缓冲区,并使用正确的缓冲区大小初始化
StringBuilder


这样做意味着您可以避免使用
固定的
缓冲区(因此,您可以避免
不安全的
代码)。

标签垃圾邮件是不好的网络礼仪只要您正确定义了所有字段的大小(您正在这样做),您就不需要指定
FieldOffset
。如果有1000个元素,则不应将
\u寄存器
声明为
结构
。将其声明为
。否则,每个分配将创建一个新的
\u寄存器
副本。C++中的代码>类<代码> >代码>结构>代码>与C代码中的<>代码>类<代码> >代码>结构>代码不一样。有没有办法去除siz?谢谢,你能给我一个狙击代码吗?[字段偏移]不是不安全的。他的代码片段很糟糕,缺少
fixed
关键字。需要进行编译。固定大小的缓冲区是不安全的,未检查对它们进行索引。@HansPassant是的,我删除了关于FieldOffset的评论。我记错了以前的一次讨论——当然,那从未发生过。。。