Ух ты, это превратилось в какой-то очень грязный код. Нам придется делать сдвиг битов вручную, поскольку вы можете потенциально задействовать более четырех байтов в этой операции в зависимости от вашего местоположения битов. Предполагая порядок байтов в младшем порядке (сначала 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;
}