[英]C# splitting array of data into several properties
我想就如何解决我的问题的最佳方法提出意见。 我有一些想法,但我认为它们远非完美,也许有人可以建议一个好方法。
下图说明了我的一般代码结构
我有一个通信模块,该模块将数据写入由数据字节组成的数组。 我想保持结构不变,因为那样的话,它是一种灵活的完全独立于GUI的解决方案。 只是为了进一步解释我的原因-数据结构表示外部硬件单元(MCU)的物理内存。
之后,我需要将数据拆分为属性。 这意味着我有一些属性绑定到GUI中的元素,从而为它们提供数据。 因此,我希望每个属性都将数组中特定区域的数据作为示例索引100:104。
对我来说有问题的部分是如何以上述方式将这些属性绑定到数组? 绑定需要两种方式。
我不确定这是否是您需要的,但是看起来您可以使用以下方法:
您可以创建一些实现属性的结构:
[StructLayout(LayoutKind.Explicit, Size = 11, Pack = 0)]
public struct MyStructure
{
public string StringFromBytes
{
get
{
if (ByteArrayField == null || ByteArrayField.Length == 0)
{
return string.Empty;
}
return Utilitites.BytesToString(ByteArrayField);
}
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] [FieldOffset(0)] public byte[] ByteArrayField;
[MarshalAs(UnmanagedType.U2)] [FieldOffset(8)] public ushort WordField;
[MarshalAs(UnmanagedType.I1)] [FieldOffset(10)] public sbyte dBm0;
}
在这里,我们有一个由11个字节组成的结构。 该结构具有对数据进行一些处理的属性。 您需要确定字段的起始位置(FieldOffset())以及应如何解释数据(例如UnmanagedType.U2-2字节无符号整数)。
当您从设备接收字节数组时,可以轻松地将该数组转换为您的结构:
public static T ToStructure<T>(this byte[] bytes) where T : struct
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
var stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
handle.Free();
return stuff;
}
用法:
byte[] responseBytes = Utilitites.GetResponseFromDevice();
MyStructure response = responseDecodedBytes.ToStructure<MyStructure>();
希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.