【问题标题】:C# splitting array of data into several propertiesC# 将数据数组拆分为多个属性
【发布时间】:2014-08-14 14:02:30
【问题描述】:

我想就如何解决我的问题的最佳方法提出意见。我有一些想法,但在我看来它们远非完美,也许有人可以提出一种很好且干净的方法来做到这一点。

下图说明了我的一般代码结构

我有一个将数据写入由数据字节组成的数组的通信模块。而且我想保持结构原样,因为它是一个灵活的完全独立于 GUI 的解决方案。只是为了进一步解释我背后的原因 - 数据结构表示外部硬件单元 (MCU) 的物理内存。

之后,我需要将该数据拆分为属性。这意味着我有几个属性绑定到 GUI 中的元素,为它们提供数据。因此,我希望每个属性都从数组中的特定区域获取数据,例如索引 100:104。

对我来说有问题的部分是如何以上述方式将这些属性绑定到数组?绑定需要有两种方式。

【问题讨论】:

  • 这个问题在 Programmers 网站上可能会更好。
  • 创建适当的数据类并使用Binary Serialization 与字节数组进行转换。

标签: c# arrays wpf binding properties


【解决方案1】:

我不确定这是否是您需要的,但看起来您可以使用这种方法:

您可以创建一些实现属性的结构:

[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>();

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多