Как лучше всего обрабатывать битовые данные в C #? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь реализовать разные сигналы, содержащие разные данные, и я реализовал различные типы данных в C # для чистого управления данными (в основном структуры, некоторые перечисления). Большинство этих типов имеют странные размеры, например, 9-битные или 3-битные и т. Д.

Я реализовал их как их ближайший эквивалент базового типа C # (большинство из них байтовые, короткие или короткие, с некоторыми целочисленными и целыми числами).

Каков общий способ обработки таких типов данных в C #? В конце я должен объединить все биты в один байтовый массив, но я не уверен, как их объединить.

Я думал о том, чтобы получить байтовый массив каждого типа с помощью BitConverter и поместить все данные как логические значения в BitArray, который я затем смог преобразовать обратно в байтовый массив. Но я не могу разделить массив байтов.

Еще один способ сделать это - сдвинуть каждую переменную, которая у меня есть, но это кажется очень грязным. Если в будущем тип изменится с 32-разрядного на 31-разрядный, это может измениться.

Как это обычно делается? Какие-нибудь лучшие практики или что-то?

В основном я хочу объединить данные разных размеров в один байтовый массив. Например, упакуйте 3-битную переменную, 2-битное логическое и 11-битное значение в 2 байта.

Поскольку у меня есть типы, реализованные как типы C #, я могу сделать BitArray arr = new BitArray(BitConverter.GetBytes((short)MyType)), но это даст мне 16 бит, в то время как MyType может иметь только 9 бит.

1 Ответ

0 голосов
/ 09 января 2019

Моя задача только реализовать структуры данных и упаковку как двоичные данные в C #

Чтобы явно манипулировать расположением ваших структур в памяти:

Используйте StructLayout. Как правило, это уместно только в случае взаимодействия или специальных ограничений памяти. См. MSDN для примеров / документации. Обратите внимание, что вы получите снижение производительности, если ваши данные не выровнены по байту.

Чтобы спроектировать структуру данных:

Просто используйте существующее решение, такое как ASN.1 или Protobuf . Эта проблема уже была решена экспертами; воспользоваться их навыками и знаниями. В качестве дополнительного бонуса использование стандартных протоколов значительно упрощает реализацию пользовательских интерфейсов третьими лицами.

...