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