簡體   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