我将旧的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属性告诉编组器在编组数据时使用什么固定大小的缓冲区.
您不需要使用不安全的固定关键字来做这种事情,我强烈建议您避免这种情况.
原文地址:https://www.jb51.cc/csharp/95653.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。