【发布时间】: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 (应该像字节顺序一样 - 每个字节我必须单独并连续地查看)