读/写压缩二进制数据

时间:2009-12-07 18:53:24

标签: c# binary-data

我读到了人们谈论逐点压缩对象的地方。像“前三位代表这样的东西,然后接下来的两个代表这个和12位代表”

我理解为什么最好尽量减少内存使用量,但我想不出一个实现它的好方法。我知道我会将它打包成一个或多个整数(或多头,无论如何),但我无法想象一个简单的方法来使用它。如果有一个类我可以从任意长度的二进制字段中获取/设置任意位,这将是非常酷的,它会照顾我的事情,而且我不必去讨论& s和|和面具等。

这种事情是否有标准模式?

4 个答案:

答案 0 :(得分:3)

来自MSDN

  

BitArray Class

     

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

示例:

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

BitArray允许您仅设置单个位。如果你想用更多的位编码值,那么可能无法用&和s和掩码和东西进行混淆: - )

答案 1 :(得分:1)

您可能想要查看.NET Framework中的BitVector32结构。它允许您定义“部分”,这些部分是int中的位范围,然后读取和写入这些部分的值。

主要限制是它仅限于一个32位整数;这取决于你想要做什么,这可能是也可能不是问题。正如dtb所提到的,BitArray可以处理任何大小的位字段,但是你一次只能获得和设置一个位 - 不像BitVector32那样支持各个部分。

答案 2 :(得分:0)

您正在寻找的内容称为按位操作。

例如,假设我们将在整数的最低有效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和OR(偶尔使用更奇特的操作),您可以轻松设置和清除任何较大值的单个位。

答案 3 :(得分:0)

我认为你最好不要使用工具包或平台特定的包装类,而是学习你的&amp; s和| s和0x04以及所有按位运算符的工作方式。总的来说,它是如何为大多数项目完成的,而且操作非常快。在大多数语言中,操作几乎完全相同,因此您不会依赖某些特定的工具包。