7

我正在寻找一种能够让我获得一系列位的方法。例如,如果我有二进制数据

0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 (2 个字节)

我可能需要从位 3 到 9 获取数据。换句话说,我会感兴趣:

0 1 0 1 1 0 1 1 1 1 0 1 01 1 1

所以简而言之,我想构造方法:

 byte[] Read(byte[] data, int left, int right){ 

     // implementation
 }

因此,如果我传递数据,new byte[]{91,215}, 3, 9 我将得到byte[]{122} (注意字节 91 和 215 =0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1字节 122 =1 1 1 1 0 1 0与示例相同的二进制数据。

如果我可以<<在字节数组上使用运算符,例如执行以下操作,那就太好了:

  byte[] myArray = new byte[] { 1, 2, 3 };
  var shift = myArray << 2;

如果你有兴趣知道我为什么需要这个功能:

我正在板上创建一个项目,并且经常需要在内存中读取和写入值。cdf、sfr 或 ddf(称为芯片定义文件)包含有关特定芯片的信息。该文件可能如下所示:

;     Name                            Zone      Address     Bytesize  Displaybase Bitrange
;     ----                            ----      -------     --------  ----------- --------

sfr = "SPI0_CONTROL"              , "Memory", 0x40001000,        4, base=16
sfr = "SPI0_CONTROL.SPH"          , "Memory", 0x40001000,        4, base=16,    bitRange=25-25
sfr = "SPI0_CONTROL.SPO"          , "Memory", 0x40001000,        4, base=16,    bitRange=24-24
sfr = "SPI0_CONTROL.TXRXDFCOUNT"  , "Memory", 0x40001000,        4, base=16,    bitRange=8-23
sfr = "SPI0_CONTROL.INT_TXUR"     , "Memory", 0x40001000,        4, base=16,    bitRange=7-7
sfr = "SPI0_CONTROL.INT_RXOVF"    , "Memory", 0x40001000,        4, base=16,    bitRange=6-6

由于我正在读取很多变量(有时每秒 80 次),我希望有一个有效的算法。我想我的方法是,如果字节大小是 8,那么我将从这 8 个字节创建一个 long,然后使用<<and>>运算符来获得我需要的东西。如果字节大小为 4,那么我将创建一个 int 并使用<<and>>运算符,但是如果我需要读取 16 个字节,我该怎么做呢?我想我的问题应该是如何在自定义结构类型上实现<<and运算符。>>

4

3 回答 3

5

您需要System.Collections中的BitArray类。

于 2012-09-26T19:31:53.570 回答
3

看起来你可以帮助“比特流”。这里有这样一个概念的实现。看一下,也许它符合您的需求。

于 2012-09-26T19:27:00.977 回答
2

BigInteger.NET 4+ 中的类Byte[]在其构造函数中采用 a 并具有左右移位运算符。

于 2012-09-26T19:36:40.403 回答