加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C#中使固定大小的字节数组用户类型?

发布时间:2020-12-15 06:25:30 所属栏目:百科 来源:网络整理
导读:我将旧的Visual BASIC程序转换为C#.它通过以太网向一些工业机器发送消息.为此,它从固定大小的用户定义的块中组装一个字节流. 大多数这些块都很小,在C#中,很容易创建几个字节或int的结构,并使用StructLayout控制它们的大小和布局,例如 [StructLayout(LayoutKi
我将旧的Visual BASIC程序转换为C#.它通过以太网向一些工业机器发送消息.为此,它从固定大小的用户定义的块中组装一个字节流.

大多数这些块都很小,在C#中,很容易创建几个字节或int的结构,并使用StructLayout控制它们的大小和布局,例如

[StructLayout(LayoutKind.Sequential,Pack = 1)]

…所以当我们进入非托管空间来做一个副本,我们没有字节顺序或填充问题.

但是一些VB6结构是大阵列,例如,

Private Type SEND_MSG_BUFFER_320_BYTES
    bytes(0 To 319) As Byte  '320 bytes
End Type

我正在C#中如何做到这一点.我可以在类中创建一个固定大小的数组,

[StructLayout(LayoutKind.Sequential,Pack = 1)]
  public class SOME_BYTES
  {
      public byte[] b = new byte[320];
  }

但是要做字节复制,我需要能够在运行时发现这个大小,并且System.Runtime.InteropServices.Marshal.SizeOf为此返回4.

任何建议,如何做到这一点将不胜感激.

解决方法

我想你想做这样的事情:
[StructLayout(LayoutKind.Sequential,Pack = 1)]
    public class SOME_BYTES
    {
        [MarshalAs(UnmanagedType.ByValArray,SizeConst=320)]
        public byte[] b;
    }

您将如下初始化它:

SOME_BYTES data = new SOME_BYTES {b = new byte[320]};

然后,您可以填充data.b []并使用编组获取要发送的数据. MarshalAs属性告诉编组器在编组数据时使用什么固定大小的缓冲区.

您不需要使用不安全的固定关键字来做这种事情,我强烈建议您避免这种情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读