Преобразовать неизвестные биты из байтового массива в int - PullRequest
1 голос
/ 20 января 2011
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 ]

2 голосов
/ 20 января 2011

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

Мне кажется, что byteLength и bitLength избыточны (тоже смещения).

Но в таком виде я бы сказал:

  • создать 8-байтовый промежуточный массив
  • скопировать байты byteLength (1..4) в этот массив, возможно со смещения 7-байтовой длины
  • используйте BitConvertor.ToInt64 (), чтобы превратить его в long
  • value = (int) (longValue >> bitOffset)

Это все еще имеет открытые концы (ожидаете ли вы подписанные или неподписанные int32?)

Я не проверял это, у вас также могут быть проблемы с порядком байтов.

...