当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中的结构中放置一个数组?

如何解决《如何在C#中的结构中放置一个数组?》经验,为你挑选了1个好方法。

C++代码:

struct tPacket
{
    WORD word1;
    WORD word2;
    BYTE byte1;
    BYTE byte2;
    BYTE array123[8];
}

static char data[8192] = {0};
...
some code to fill up the array
...
tPacket * packet = (tPacket *)data;

我们不能在C#中轻松做到这一点.

请注意,C++结构中有一个数组.

或者,使用此源文件可以为我们完成工作,但如果结构中有数组则不行.



1> JaredPar..:

我不确定你究竟在问什么.您是否尝试在C#中获取等效的结构定义以用于普通的旧C#用法或用于互操作(PInvoke)目的?如果它适用于PInvoke,则follownig结构将起作用

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tPacket {

    /// WORD->unsigned short
    public ushort word1;

    /// WORD->unsigned short
    public ushort word2;

    /// BYTE->unsigned char
    public byte byte1;

    /// BYTE->unsigned char
    public byte byte2;

    /// BYTE[8]
    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=8, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
    public byte[] array123;
}

如果您正在寻找具有相同特征的普通旧C#结构,那么遗憾的是不可能使用结构.您无法在C#结构中定义常量大小的内联数组,也无法通过初始化程序强制数组为特定大小.

托管世界中有两种备选方案.

使用具有填充数组的create方法的结构

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tPacket {
    public ushort word1;
    public ushort word2;
    public byte byte1;
    public byte byte2;
    public byte[] array123;
    public static tPacket Create() { 
      return new tPacket() { array123 = new byte[8] };
    }
}

或者使用一个类,您可以直接初始化array123成员变量.

EDIT OP知道如何将byte []转换为tPacket值

不幸的是,在C#中没有很好的方法可以做到这一点.C++对于这种任务很棒,因为它有一个非常弱的类型系统,你可以选择将字节流视为一个特定的结构(邪恶的指针转换).

这在C#不安全代码中可能是可能的,但我不相信.

基本上,您需要做的是手动解析字节并将它们分配给结构中的各种值.或者编写一个本地方法,将C样式转换和PInvoke转换为该函数.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有