如何最好地处理 C# 中的位数据?

How to best handle bit data in C#?

我正在尝试实现包含不同数据的不同信号,并且我在 C# 中实现了各种数据类型以干净地管理数据(主要是结构,一些枚举)。大多数这些类型的大小都很奇怪,比如有些是 9 位或 3 位等。

我将它们实现为最接近的等效基本 C# 类型(大多数是 byte、ushort 或 short,还有一些 int 和 uint)。

在 C# 中处理此类数据类型的一般方法是什么?最后我不得不将所有位组合成一个字节数组,但我不确定如何组合它们。

我考虑过使用 BitConverter 获取每种类型的字节数组,并将所有数据作为布尔值放入 BitArray,然后我可以将其转换回字节数组。但是我似乎无法拆分字节数组。

另一种方法是移动我拥有的每个变量,但这似乎真的很脏。如果将来某个类型从 32 位更改为 31 位,那似乎很难更改。

这通常是如何完成的?有什么最佳做法吗?

基本上我想将不同大小的数据组合成一个字节数组。例如,将一个 3 位变量、一个 2 位布尔值和一个 11 位值打包成 2 个字节。

因为我将类型实现为 C# 类型,所以我可以做 BitArray arr = new BitArray(BitConverter.GetBytes((short)MyType)),但这会给我 16 位,而 MyType 可能只有 9 位。

My task is only to implement the data structures and the packing as binary data in C#

显式操作结构的内存布局:

使用StructLayout。通常,这仅适用于处理互操作或专门的内存约束。 examples/documentation 见 MSDN。请注意,如果您的数据不是字节对齐的,您的性能将会受到影响。

设计数据结构:

只需使用像 ASN.1 or Protobuf 这样的现有解决方案。专家已经解决了这个问题;利用他们的技能和知识。作为一个额外的好处,使用标准协议使第三方更容易实现自定义接口。