Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读/写压缩二进制数据_C#_Binary Data - Fatal编程技术网

C# 读/写压缩二进制数据

C# 读/写压缩二进制数据,c#,binary-data,C#,Binary Data,我读遍了各地人们谈论的一点一点地压缩对象的文章。比如“前三位代表某某,后两位代表这个,12位代表那个” 我理解为什么需要最小化内存使用,但我想不出一个好的方法来实现这一点。我知道我会把它打包成一个或多个整数(或长整数,随便什么),但我无法想象一个简单的方法来处理它。如果有一个类,我可以从任意长度的二进制字段中获取/设置任意位,这将是非常酷的,它将为我处理事情,我不必去处理&’s和|以及掩码等等 这类东西有标准样式吗?来源: 位数组类 管理以布尔值表示的紧凑位值数组,其中true表示位为开(1),

我读遍了各地人们谈论的一点一点地压缩对象的文章。比如“前三位代表某某,后两位代表这个,12位代表那个”

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

这类东西有标准样式吗?

来源:

位数组类

管理以布尔值表示的紧凑位值数组,其中true表示位为开(1),false表示位为关(0)

例如:

BitArray myBitArray = new BitArray(5);
myBitArray[3] = true; // set bit at offset 3 to 1
不过,BitArray只允许设置单个位。如果你想用更多的比特对值进行编码,可能没有办法用&’s和|’s以及掩码之类的东西来处理:-)

来自:

位数组类

管理以布尔值表示的紧凑位值数组,其中true表示位为开(1),false表示位为关(0)

例如:

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

不过,BitArray只允许设置单个位。如果你想用更多的位来编码值,可能没有办法用&’s和|’s以及掩码之类的东西来处理:-)

你要找的是所谓的按位操作

例如,我们将用整数的最低有效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.
}
void setR(ref int RGBValue,int newR)
{

int newRValue=newR您正在寻找的被称为按位操作

例如,我们将用整数的最低有效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.
}
void setR(ref int RGBValue,int newR)
{

int newRValue=newR与使用工具箱或特定于平台的包装器类相比,我认为你最好还是咬紧牙关,学习&s和| s和0x04s以及所有按位运算符的工作原理。大体上,大多数项目都是这样做的,操作速度非常快。大多数项目的操作几乎相同语言,这样您就不会依赖于某些特定的工具包。

与使用工具包或特定于平台的包装类相比,我认为您最好咬紧牙关,学习&s和| s和0x04s以及所有按位运算符的工作方式。大体上,大多数项目都是这样做的,操作非常复杂t、 大多数语言上的操作几乎相同,因此您不必依赖于某些特定的工具包。

您可能需要检查.NET Framework中的结构。它允许您定义“节”,即int中的位范围,然后读取和写入这些节的值


主要限制是它被限制为单个32位整数;这可能是问题,也可能不是问题,取决于您尝试执行的操作。正如dtb所述,BitArray可以处理任何大小的位字段,但您一次只能获取和设置一个位——不支持BitVector32中的节。

您可能需要查看NET框架中的结构。它允许您定义“节”,即int中的位范围,然后读取和写入这些节的值


主要的限制是它被限制为单个32位整数;这可能是一个问题,也可能不是问题,这取决于您尝试执行的操作。正如dtb所提到的,BitArray可以处理任何大小的位字段,但您一次只能获取和设置一个位——不支持BitVector32中的节。

注意:我在C中从未做过这些工作,所以我的语法可能有点不对劲。但它应该足以让你继续。注意:我从来没有在C#中做过这些,所以我的语法可能有点不对劲。但它应该足以让你继续。这似乎接近我所需要的。我总是可以编写自己的包装,将更大的值塞进其中。我将在比较性能和ot时看看会发生什么她的备选方案。这似乎接近于我所需要的。我总是可以编写自己的包装,将更大的值塞进其中。我将在与其他备选方案进行性能比较时看看会发生什么。