【问题标题】:How to get the value of a bit at a certain positions from a byte array?如何从字节数组中获取某个位置的位值?
【发布时间】:2013-12-12 22:01:55
【问题描述】:
byte[] sample = new byte[]{10,20,30};

-值为6位,从第三位开始(从右到左)

new byte[]{10,20,30} 看起来像“00001010 00010100 00011110”(应该按照字节顺序排列) 所以我需要“00001010 00010100 *000111*10” -我的值是 7

基于帮助的解决方案(Yaur回答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;
        }

【问题讨论】:

  • 我认为你的问题不是很清楚。你能解释一下你在这部分“新字节[] {10,20,30}是“1010 10100 11110”我需要......”的意思吗?
  • BitArray 没有.Copy(byte[]) 函数。应该是CopyTo 还是扩展方法?
  • 除以 8 找到字节索引。余数是该字节内的位索引。
  • new byte[]{10,20,30} 不是1010 10100 11110。这是00011110 00010100 00001010
  • 是的,我的错,它是 00001010 00010100 00011110 (应该像字节顺序一样 - 每个字节我必须单独并连续地查看)

标签: c# byte bits


【解决方案1】:

这应该适用于大多数输入:

public bool GetValue(byte[] data, int position) 
{
    var bytePos = position / 8;
    var bitPos = position % 8;
    return ((data[bytePos] & (1 << bitPos))!=0)
    // depending on the order in which you expect the bits you might need this instead
    //return ((data[bytePos] & (1 << (7-bitPos)))!=0)

}

public 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;i<position+length;i++)
    {
         if(GetValue(data,i)
         {
             retv |=1;
         }
         retv = retv << 1;
    }
    retv = retv >> 1;
}

【讨论】:

  • 您的意思是“retv = retv > 1;”吗?...我尝试了这个,但看起来有问题 - 也许问题在于反转位在完成值之前?
  • 没错,我在答案中修复了它并添加了代码以将位从高位变为低位。
  • 仍然无法获得值 7 :) 在任何情况下都有问题:(真的我不确定我是否理解你的代码在做什么:(
  • 如果您将其作为比特流处理,7 是正确的答案。如果你通过了 13 的位置和 8 的长度 100 00011111100,你会期待什么?
  • byte[] {10,20,30} 是“00001010 00010100 00011110” - 字节应该按“按顺序”转换为位,而不是我需要位置 13 的值和长度 8 ,我应该像在 Windows 计算器中一样从右侧获取这个值:0000 /*1010 0001*/ 0100 00011110,所以我的值是 1010 0001
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 2013-06-28
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
相关资源
最近更新 更多