繁体   English   中英

C#将数据数组拆分为几个属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM