【问题标题】:How to best handle bit data in C#?如何最好地处理 C# 中的位数据?
【发布时间】:2019-01-08 20:11:49
【问题描述】:

我正在尝试实现包含不同数据的不同信号,并且我在 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 位。

【问题讨论】:

  • 你能详细说明你想要做什么吗?一些上下文会有所帮助。
  • 我想将不同大小的数据组合成一个字节数组。例如将一个 3 位变量、一个 2 位布尔值和一个 11 位值打包成 2 个字节
  • 请说明您希望如何将那些奇数大小的位组放入字节数组中。它们将如何对齐和包装等...?另外,这个字节数组拆分业务是关于什么的?请不要在 cmets 中解释和澄清您的问题。 编辑并改进问题本身... ;-)
  • 添加了一个例子。
  • 不要使用 BitConverter,它会让你的生活变得痛苦,因为它不适合奇数大小的位组,而是用于“正常大小”的原始值类型。相反,我建议您编写辅助方法(可以是您的类型的方法,静态或扩展方法),它们采用您的值之一并仅使用提供的方法创建一个适当的 BitArray(或将值写入现有的 BitArray)位数组类型。类似地,您还可以编写一个方法(或多个方法),该方法采用 BitArray 并从任何 BitArray 位置提取那些奇数大小的值

标签: c# bit binary-data


【解决方案1】:

我的任务只是将数据结构和打包实现为 C#中的二进制数据

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

使用StructLayout。通常,这仅适用于处理互操作或专门的内存限制。有关示例/文档,请参阅 MSDN。请注意,如果您的数据不是字节对齐的,您的性能会受到影响。

设计数据结构:

只需使用现有的解决方案,例如 ASN.1Protobuf。专家已经解决了这个问题;利用他们的技能和知识。另外,使用标准协议可以让第三方更轻松地实现自定义接口。

【讨论】:

  • 是否有用于 C# 的 ASN.1 库,或者我需要的似乎是 System.Security.Cryptography 中的 AsnEncodedData 类?
  • @sollniss:我不认为AsnEncodedData 支持所有编码,尽管它可能足以满足您的需求。但是,我不推荐它。通用 ASN.1 支持是 under consideration。 ASN.1 有一些付费和免费库。但是,我会推荐 Protobuf,尤其是 Protobuf.Net。 Protobuf.Net 旨在使用惯用的 C#,因此您可能会发现它更容易工作。
猜你喜欢
  • 2010-09-26
  • 2015-12-22
  • 2010-10-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2020-10-03
相关资源
最近更新 更多