将未知位从Byte数组转换为int

时间:2011-01-20 18:43:23

标签: c# .net binary bit-manipulation math

private int bitToIntParser
(byte[] recordData, int byteOffset, int byteLength, int bitOffset, int bitLength)
        {
            //step1:Byte[] selectedBytes = recordData[byteOffset to byteOffset + Length]  
            //step2:BitArray selectedBits=selectdBytes.bits[bitOffset to bitOffset+bitLength]
            //step3:convert selectedBit to Int          
        }

上述功能应该能够从bytes[byteOffset]中提取bytes[byteOffset+length]recordData,然后从前一个结果中提取bit[bitOffset]bit[bitOffset+BitLength]并将其转换为int

任何人都可以帮我这个吗?

2 个答案:

答案 0 :(得分:2)

哇,这已经变成了一些非常混乱的代码。我们必须手动进行位移,因为根据位的位置,可能在此操作中涉及超过四个字节。假设小端字节顺序(LSB优先):

// No need for byte length, since you're passing in a bit count
private int ParseByteArray(byte[] recordData, int offset, int bitOffset, 
       int bitCount)
{
    if(bitCount < 1 || bitCount > 32) 
    {
        throw new ArgumentException("bitCount must be between 1 and 32");
    }

     int output = 0;
    int byteCount = 0;

    byte rightMask = (byte)(((1 << bitOffset) - 1) << (8 - bitOffset));
    byte leftMask = (byte)(255 ^ rightMask);

    while (bitCount > 0)
    {
        byte data = (byte)(((recordData[offset] & leftMask) << bitOffset) + 
                    ((bitCount > 8 - bitOffset ? 
                    ((recordData[offset + 1] & rightMask) >> (8 - bitOffset)) 
                    : 0)));

        if (bitCount < 8)
        {
            byte mask = (byte)(255^((1 << (8 - bitCount)) - 1));

            data = (byte)((data & mask) >> (8 - bitCount));
        }

        offset++;

        output += data << (byteCount * 8);

        byteCount++;

        bitCount -= Math.Min(bitCount, 8);
    }

    return output;
}

答案 1 :(得分:1)

在我看来,byteLength和bitLength是冗余的(偏移也是如此)。

但就目前而言,我会说:

  • 制作一个8字节的中间数组
  • 将byteLength字节(1..4)复制到该数组,可能来自偏移量7-byteLength
  • 使用BitConvertor.ToInt64()将其转换为long
  • value =(int)(longValue&gt;&gt; bitOffset)

这仍然有开放的结束(你期望签名或未签名的int32?)

我没有对此进行测试,您可能也会遇到字节序问题。