【问题标题】:C# - Shifting and reversing the order of bits in a byte arrayC# - 移位和反转字节数组中的位顺序
【发布时间】:2013-01-21 01:04:33
【问题描述】:

我正在尝试从字节数组中获取正确的 int。 通过 .Net 的 POS 从 RFIDTag 读取字节。 (其实我需要 18 位)

二进制字节数组如下: 00001110 11011100 00000000 00011011 10000000

我需要摆脱它的是: 00 00000000 11101101 (int = 237)

从原始字节中以相反的顺序排列以下位: ------10 11011100 00000000

我一直在研究 bitArray。数组.反向。以及几种移位位的方法。但我就是无法理解这个。

谁能指出我正确的方向?

【问题讨论】:

  • 为什么要倒序? << 4 不会将所需的数字移到第一个字节中吗?对这些位的描述将比仅仅猜测所需信息的位置非常有用且更好。
  • 由于回文位序列 1110110111 很难判断您是需要反转还是只是位移。
  • 是的,除非我们得到规范,否则我们会以猜测结束。但是很难相信这些位应该被颠倒。字节,好的,但是位?从未遇到过位反转的情况。
  • 看看这个问题(以及“最佳”答案):stackoverflow.com/questions/6654159/…
  • 嗨。谢谢您的帮助。但我没有具体说明。我的场景是这样的:我有一个 RFID (iClass) 读卡器。我有 5 张可以测试的卡。卡片上写有一个数字,但这个数字只是读取时给出的实际字节/位的一部分。我使用 Docklight (docklight.de/download_en.htm) 读取卡片并获取卡片上的信息。我发现要正确获取每张卡上的号码,我需要在每张卡上遵循相同的程序。选择相同的 18 位,并以相反的顺序设置它们。大卫

标签: c# binary byte bits bitarray


【解决方案1】:

您可以像这样获取位并反转它们:

byte[] data = { 0x0E, 0xDC, 0x00, 0x1B, 0x80 };

// get only first four bytes
byte[] bits = new byte[4];
Array.Copy(data, 0, bits, 0, 4);

// reverse array if system uses little endian
if (BitConverter.IsLittleEndian) {
  Array.Reverse(bits);
}

// get a 32 bit integer from the four bytes
int n = BitConverter.ToInt32(bits, 0); // 0x0EDC001B

// isolate the 18 bits by shifting and anding
n >>= 8; // 0x000EDC00
n &= 0x0003FFFF; // 0x0002DC00

// reverse by shifting bits out to the right and in from the left
int result = 0;
for (int i = 0; i < 18; i++) {
  result = (result << 1) + (n & 1);
  n >>= 1;
}

Console.WriteLine(result);

输出:

237

【讨论】:

  • 谢谢@Guffa,我一上班就试试这个。它似乎比我昨天想出的“没有工作的烂摊子”要干净得多:-)
【解决方案2】:

也许

// 00001110 11011100 00000000 00011011 10000000
//    0E       DC       00       1B       80   
byte[] info = new byte[] { 0x0E, 0xDC, 0x00, 0x1B, 0x80 };
int result = (info[0] << 4) | (info[1] >> 4);
Console.WriteLine(result); // ==> 237

info[0] &lt;&lt; 40E 变成E0

&gt;&gt; 4DC 变成0D

| ORs E00DED 是十进制的 237

【讨论】:

  • 这不是正确的位。这些位给出相同的结果只是巧合。
猜你喜欢
  • 2016-02-27
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 2012-06-09
相关资源
最近更新 更多