Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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#_Byte_Bits - Fatal编程技术网

C# 如何从字节数组中获取特定位置的位值?

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

-该值为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/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,长度为8
100 000111
11100
?字节[]{10,20,30}是“00001010 0000100 00011110”-字节应按“顺序”转换为位,如果我需要位置13的值和长度8,我应该从右边得到这个值,就像在windows计算器中一样:0000/*1010 0001*/0100 0001110,所以我的值是1010 0001,你的意思是“retv=retv>1;”?…我尝试了这个方法,但看起来好像有问题-可能问题在于在完成值之前反转位?这是正确的,我在答案中修复了它,并添加了代码以将位从高阶到低阶。仍然无法获得值7:)在任何情况下都有问题:(真的,我不确定我是否理解您的代码在做什么:(7是正确答案,如果您将其作为位流处理。如果您传递的位置为13,长度为8
100 000111
或<