C# 如何从字节数组中获取特定位置的位值?
-该值为6位,从第三位开始(从右到左) 新字节[]{10,20,30}看起来像“00001000001000011110”(应该像字节顺序一样排列) 所以我需要“0000100000100*000111*10” -我的值是7 基于帮助的解决方案(回答1 byYaur),只是改变了方向C# 如何从字节数组中获取特定位置的位值?,c#,byte,bits,C#,Byte,Bits,-该值为6位,从第三位开始(从右到左) 新字节[]{10,20,30}看起来像“00001000001000011110”(应该像字节顺序一样排列) 所以我需要“0000100000100*000111*10” -我的值是7 基于帮助的解决方案(回答1 byYaur),只是改变了方向 byte[] sample = new byte[]{10,20,30}; 公共静态bool GetValue(字节[]数据,int位置) { var bytePos=data.Length-1-position
byte[] sample = new byte[]{10,20,30};
公共静态bool GetValue(字节[]数据,int位置)
{
var bytePos=data.Length-1-position/8;//右->左
//var bytePos=position/8;//左->右
var bitPos=位置%8;
返回((数据[bytePos]&(左1)
//返回((数据[bytePos]&(1右)
}
公共静态long GetValue(字节[]数据,int位置,int长度)
{
如果(长度>62)
{
抛出新ArgumentException(“如果第一位为1,则无法正常使用63位”);
}
长retv=0;
对于(int i=位置+长度-1;i>位置-1;i--)
//for(int i=位置;i右
{
如果(GetValue(data,i))retv |=1;
retv=retv>1;
返回电视;
}
这适用于大多数输入:
public static bool GetValue(byte[] data, int position)
{
var bytePos = data.Length - 1 - position / 8;//right -> left
//var bytePos = position / 8;//left -> right
var bitPos = position % 8;
return ((data[bytePos] & (1 << bitPos)) != 0);//right -> left
//return ((data[bytePos] & (1 << (7 - bitPos))) != 0); //left -> right
}
public static long GetValue(byte[] data, int position, int length)
{
if (length > 62)
{
throw new ArgumentException("not going to work properly with 63 bits if the first bit is 1");
}
long retv = 0;
for (int i = position + length - 1; i > position - 1; i--)
//for(int i = position;i<position+length;i++)//left -> right
{
if (GetValue(data, i)) retv |= 1;
retv = retv << 1;
}
retv = retv >> 1;
return retv;
}
public bool GetValue(字节[]数据,整数位置)
{
var bytePos=位置/8;
var bitPos=位置%8;
返回((数据[bytePos]&(1这应该适用于大多数输入:
public static bool GetValue(byte[] data, int position)
{
var bytePos = data.Length - 1 - position / 8;//right -> left
//var bytePos = position / 8;//left -> right
var bitPos = position % 8;
return ((data[bytePos] & (1 << bitPos)) != 0);//right -> left
//return ((data[bytePos] & (1 << (7 - bitPos))) != 0); //left -> right
}
public static long GetValue(byte[] data, int position, int length)
{
if (length > 62)
{
throw new ArgumentException("not going to work properly with 63 bits if the first bit is 1");
}
long retv = 0;
for (int i = position + length - 1; i > position - 1; i--)
//for(int i = position;i<position+length;i++)//left -> right
{
if (GetValue(data, i)) retv |= 1;
retv = retv << 1;
}
retv = retv >> 1;
return retv;
}
public bool GetValue(字节[]数据,整数位置)
{
var bytePos=位置/8;
var bitPos=位置%8;
返回((数据[bytePos]&(1这应该适用于大多数输入:
public static bool GetValue(byte[] data, int position)
{
var bytePos = data.Length - 1 - position / 8;//right -> left
//var bytePos = position / 8;//left -> right
var bitPos = position % 8;
return ((data[bytePos] & (1 << bitPos)) != 0);//right -> left
//return ((data[bytePos] & (1 << (7 - bitPos))) != 0); //left -> right
}
public static long GetValue(byte[] data, int position, int length)
{
if (length > 62)
{
throw new ArgumentException("not going to work properly with 63 bits if the first bit is 1");
}
long retv = 0;
for (int i = position + length - 1; i > position - 1; i--)
//for(int i = position;i<position+length;i++)//left -> right
{
if (GetValue(data, i)) retv |= 1;
retv = retv << 1;
}
retv = retv >> 1;
return retv;
}
public bool GetValue(字节[]数据,整数位置)
{
var bytePos=位置/8;
var bitPos=位置%8;
返回((数据[bytePos]&(1这应该适用于大多数输入:
public static bool GetValue(byte[] data, int position)
{
var bytePos = data.Length - 1 - position / 8;//right -> left
//var bytePos = position / 8;//left -> right
var bitPos = position % 8;
return ((data[bytePos] & (1 << bitPos)) != 0);//right -> left
//return ((data[bytePos] & (1 << (7 - bitPos))) != 0); //left -> right
}
public static long GetValue(byte[] data, int position, int length)
{
if (length > 62)
{
throw new ArgumentException("not going to work properly with 63 bits if the first bit is 1");
}
long retv = 0;
for (int i = position + length - 1; i > position - 1; i--)
//for(int i = position;i<position+length;i++)//left -> right
{
if (GetValue(data, i)) retv |= 1;
retv = retv << 1;
}
retv = retv >> 1;
return retv;
}
public bool GetValue(字节[]数据,整数位置)
{
var bytePos=位置/8;
var bitPos=位置%8;
return((data[bytePos]&(1我认为你的问题不是很清楚。你能解释一下你在这一部分中的意思吗?“新字节[]{10,20,30}是“1010 10100 11110”,我需要…”位数组没有.Copy(字节[])
函数。这应该是CopyTo
还是一种扩展方法?除以8找到字节索引。剩余部分是该字节内的位索引。新字节[]{10,20,30}
不是101010001110
。它是00011101000001000001010
。是的,我的错误,它是0000100000100000100001110(应该像字节顺序一样顺序-每个字节我都必须分别和依次查看)我认为你的问题不是很清楚。你能解释一下你在这部分中的意思吗“新字节[]{10,20,30}是“1010 10100 11110”,我需要…”位数组没有.Copy(字节[])
函数。这应该是CopyTo
还是一种扩展方法?除以8找到字节索引。剩余部分是该字节内的位索引。新字节[]{10,20,30}
不是101010001110
。它是00011101000001000001010
。是的,我的错误,它是0000100000100000100001110(应该像字节顺序一样顺序-每个字节我都必须分别和依次查看)我认为你的问题不是很清楚。你能解释一下你在这部分中的意思吗“新字节[]{10,20,30}是“1010 10100 11110”,我需要…”位数组没有.Copy(字节[])
函数。这应该是CopyTo
还是一种扩展方法?除以8找到字节索引。剩余部分是该字节内的位索引。新字节[]{10,20,30}
不是101010001110
。它是00011101000001000001010
。是的,我的错误,它是0000100000100000100001110(应该像字节顺序一样顺序-每个字节我都必须分别和依次查看)我认为你的问题不是很清楚。你能解释一下你在这部分中的意思吗“新字节[]{10,20,30}是“1010 10100 11110”,我需要…”位数组没有.Copy(字节[])
函数。这应该是CopyTo
还是一种扩展方法?除以8找到字节索引。剩余部分是该字节内的位索引。新字节[]{10,20,30}
不是101010001110
。它是00011101000001000001010
。是的,我的错误,它是0000100000100000100001110(应该像字节顺序一样顺序-每个字节我必须分别和依次查看)您的意思是“retv=retv>1;”?…我尝试了这个方法,但看起来好像有问题-可能问题在于在完成值之前反转位?这是正确的,我在答案中修复了它,并添加了代码以将位从高阶到低阶。仍然无法获得值7:)在任何情况下都有问题:(真的,我不确定我是否理解您的代码在做什么:(7)如果将其作为位流处理,则是正确答案。如果传递的位置为13,长度为8100 000111
或11100
?字节[]{10,20,30}是“00001010 0000100 00011110”-字节应按“顺序”转换为位,如果我需要位置13的值和长度8,我应该从右边得到这个值,就像在windows计算器中一样:0000/*1010 0001*/0100 0001110,所以我的值是1010 0001,你的意思是“retv=retv>1;”?…我尝试了这个方法,但看起来好像有问题-可能问题在于在完成值之前反转位?这是正确的,我在答案中修复了它,并添加了代码以将位从高阶到低阶。仍然无法获得值7:)在任何情况下都有问题:(真的,我不确定我是否理解您的代码在做什么:(7是正确答案,如果您将其作为位流处理。如果您传递的位置为13,长度为8100 000111
或<