【问题标题】:C# Write 8 bits packet divided in 3 intsC# 写入 8 位数据包,分成 3 个整数
【发布时间】:2021-03-04 13:47:30
【问题描述】:

我需要在这个分区中写一个 8 位数据包,其中包括 3 个整数:

int1 = 1 bit
int2 = 1 bit
int3 = 6 bit

我不知道该怎么做。我可以写一些 4 字节的数据包,使用这个对我们有用的函数:

buffer.AddRange(BitConverter.GetBytes(_value));

但我需要帮助来编写一个 8 位数据包,该数据包分为许多整数(或位元素)。我已经阅读过有关 BitArray 的信息,但我真的不知道如何使用它。我已经写了一些代码,但不知道它是否真的可以工作:

bool playback = false;
bool extExerciseNum = false;
BitArray byte4 = new BitArray(2);
byte4.Set(0, playback);
byte4.Set(1, extExerciseNum);

在这里,我假装使用前 2 个单独的整数创建一个 BitArray。

int exerciseNumber = 23;
BitArray b = new BitArray(new int[] { exerciseNumber });
int[] bits = b.Cast<bool>().Select(bit => bit ? 1 : 0).ToArray();

在这里,我假装写了一个 6 位长度的 BitArray(顺便说一下,我没有正确理解它)。

任何人都可以帮助我如何正确编写这个包?非常感谢!!

【问题讨论】:

  • 只需将它们移入即可。它们需要按哪个顺序排列?
  • 那个顺序:1位在前;然后再 1 位;最后,最后是 6 位 int。
  • 在一个字节内,“第一”没有意义。 @TheGeneral 的问题是 int1 应该占据最高有效位 (MSB) 还是最低有效位 (LSB)
  • 是的对不起,int1占用了MSB

标签: c# integer bit packet bitarray


【解决方案1】:

假设int1 应该占据最高有效位(MSB),使用位移和或产生8位值:

byte result = (byte)((int1 << 7) | (int2 << 6) | int3);

(不包括范围检查)。 对于其他位顺序(int1 应占据最低有效位):

byte result = (byte)(int1 | (int2 << 1) | (int3 << 2));

【讨论】:

  • 非常感谢!所以也许,最终的代码看起来像这样(使用整数:1、0 和 23)?: byte result = (byte)((1
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多