代码之家  ›  专栏  ›  技术社区  ›  captncraig

读/写压缩二进制数据

  •  1
  • captncraig  · 技术社区  · 16 年前

    我到处都读到人们谈论压缩对象的文章。比如“前三位代表这样和那样,后两位代表这个,12位代表那个”

    我理解为什么需要最小化内存使用,但我想不出一个好的方法来实现这一点。我知道我会把它打包成一个或多个整数(或long,随便什么),但我不能想象一个简单的方法来处理它。如果有一个类,我可以从一个任意长度的二进制字段中获取/设置任意位,这将是非常酷的,它将为我处理一些事情,并且我不必再去弄脏&s、s和掩码等等。

    这种东西有标准样式吗?

    4 回复  |  直到 16 年前
        1
  •  3
  •   dtb    16 年前

    MSDN 以下内容:

    位数组类

    管理一个紧凑的位值数组,它表示为布尔值,其中true表示位为on(1),false表示位为off(0)。

    例子:

    BitArray myBitArray = new BitArray(5);
    myBitArray[3] = true; // set bit at offset 3 to 1
    

    但是,位数组允许您只设置单个位。如果您想用更多的位来编码值,那么很可能没有办法用&s和&124;s以及蒙板之类的东西来进行编码:—)

        2
  •  1
  •   Aaron    16 年前

    你可能想看看 BitVector32 .NET框架中的结构。它允许您定义“节”,它是一个int内的位范围,然后读取和写入这些节的值。

    主要的限制是它仅限于一个32位整数;这可能是一个问题,也可能不是问题,具体取决于您要做什么。正如DTB所提到的,BitArray可以处理任何大小的位字段,但一次只能获取和设置一个位——不支持BitVector32中的节。

        3
  •  0
  •   Aric TenEyck    16 年前

    您要寻找的是所谓的位操作。

    例如,假设我们要用一个整数中最不重要的24位来表示一个RGB值,R是23-16位,G是15-8位,B是7-0位。

    您可以将r设置为0到255之间的任何值,而不影响其他位,如:

    void setR(ref int RGBValue, int newR)
    {
      int newRValue = newR << 16; // shift it left 16 bits so that the 8 low-bits are now in position 23-16
      RGBValue = RGBValue & 0x00FF; // AND it with 0x00FF so that the top 16 bits are set to zero
      RGBValue = RGBValue | newRValue;   // now OR it with the newR value so that the new value is set.
    }
    

    通过使用位AND和ORS(偶尔还有更奇特的操作),您可以轻松地设置和清除较大值的任何单个位。

        4
  •  0
  •   whatsisname    16 年前

    我认为,与其使用工具箱或特定于平台的包装类,不如咬紧牙关,学习&S、&S和0x04,以及所有按位运算符的工作方式。总的来说,这就是它对大多数项目所做的工作,而且操作非常快速。在大多数语言中,操作几乎是相同的,因此您不会被某些特定的工具箱所束缚。