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
。
任何人都可以帮我这个吗?
答案 0 :(得分:2)
// 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是冗余的(偏移也是如此)。
但就目前而言,我会说:
long
这仍然有开放的结束(你期望签名或未签名的int32?)
我没有对此进行测试,您可能也会遇到字节序问题。