C # разбивает массив данных на несколько свойств

1

Я хотел бы получить мнение о том, каким будет наилучший подход к решению моей проблемы. У меня есть некоторые идеи, но они далеки от совершенства, и, возможно, кто-то может предложить хороший и чистый способ, как это сделать.

На рисунке ниже показана моя общая структура кода Изображение 174551

У меня есть модуль связи, который записывает данные в массив, состоящий из байтов данных. И я хочу сохранить структуру там, как есть, потому что тогда это гибкое полностью независимое от GUI решение. Чтобы объяснить причину этого дальше, структура данных представляет собой физическую память внешнего аппаратного блока (MCU).

После этого мне нужно разделить эти данные на свойства. Это означает, что у меня есть несколько свойств, которые привязаны к элементам в графическом интерфейсе, предоставляя им данные. Таким образом, я хочу, чтобы каждое свойство принимало данные из определенного региона в массиве в качестве примера индекса 100: 104.

Проблемная часть для меня заключается в том, как связать эти свойства с массивом указанным способом? Связывание должно быть двухсторонним.

  • 1
    Этот вопрос может быть лучше на сайте программистов.
  • 1
    Создайте правильный класс данных и используйте двоичную сериализацию для преобразования в и из байтового массива.
Теги:
arrays
wpf
binding
properties

1 ответ

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

Надеюсь, что это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню