Массив байтов в массив bool - PullRequest
1 голос
/ 22 апреля 2020

Я хочу взять байт [] и преобразовать его в bool []. Я нашел код, который помещает bool в очередь bool, но я не обладаю необходимым умением / знаниями для go от метода, который дает мне очередь bool, к методу, который дает мне массив bool.

Любая помощь приветствуется!

public void TmsTdiEnqueue(int bitCount, byte[] byteArray)
        {
            // New TAP bit queues with allocated number of bits
            boolQueue = new Queue<bool>(bitCount);

            // Fill bool queue
            int byteIndex = 0;
            int bitMask = 0x01;
            for (int i = 0; i < bitCount; i++)
            {
                boolQueue.Enqueue((tmsBytes[byteIndex] & bitMask) != 0);
                IncrementBitPointer(ref byteIndex, ref bitMask);
            }
        }

        private void IncrementBitPointer(ref int byteIndex, ref int bitMask)
        {
            byteIndex += (bitMask == 0x80) ? 1 : 0;
            bitMask = (bitMask == 0x80) ? 0x01 : bitMask << 1;
        }

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Если исходный массив byte[] имеет одно логическое значение на бит, вы можете просто использовать класс BitArray:

BitArray ba = new BitArray(new byte[] { 1, 2, 3 });
bool[] ret = new bool[ba.Length];
ba.CopyTo(ret, 0);
1 голос
/ 22 апреля 2020

Вы можете использовать SelectMany для этого. Сначала начнем с метода, который преобразует один byte в массив bool:

static bool[] ByteToBools(byte value)
{
    var values = new bool[8];

    values[0] = (value & 1) == 0 ? false : true;
    values[1] = (value & 2) == 0 ? false : true;
    values[2] = (value & 4) == 0 ? false : true;
    values[3] = (value & 8) == 0 ? false : true;
    values[4] = (value & 16) == 0 ? false : true;
    values[5] = (value & 32) == 0 ? false : true;
    values[6] = (value & 64) == 0 ? false : true;
    values[7] = (value & 128) == 0 ? false : true;

    return values;
}

Теперь мы просто SelectMany над массивом byte, и для каждого байта мы вызываем ByteToBools:

var numbers = new byte[]{1, 2, 3, 5, 255};

var bits = numbers.SelectMany(number => ByteToBools(number));
foreach(var bit in bits)
{
    Console.WriteLine(bit);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...