Сохранить матрицу как последовательность битов в c# - PullRequest
1 голос
/ 01 марта 2020

У меня есть двоичная матрица 8x8, представленная в виде одномерного массива

byte[] m = { 0, 1, 1, 1, 1, 0, 0, 1,
             1, 1, 1, 1, 1, 0, 0, 1,
             0, 1, 1, 1, 1, 0, 0, 1,
             1, 1, 1, 1, 0, 0, 0, 1,
             0, 1, 1, 0, 1, 0, 0, 1,
             0, 1, 1, 1, 1, 0, 0, 1,
             1, 1, 1, 1, 1, 0, 0, 1,
             1, 1, 1, 1, 1, 0, 0, 1 };

Есть ли способ сохранить его в двоичный файл, который будет иметь общий размер 8 байтов? Каждый 0 и 1 ноль будут иметь размер 1 бит.

1 Ответ

1 голос
/ 01 марта 2020

Вы можете использовать следующую функцию для сжатия массива 0 и 1 в массив байтов:

IEnumerable<byte> Compress(byte[] a)
{
    for (var i = 0; i < a.Length / 8f; i++)
    {
        var slice = a.Skip(i * 8).Take(8);
        byte b = 0;
        foreach (var s in slice)
        {
            b <<= 1;
            if (s == 1)
                b |= 1;
        }
        yield return b;
    }
}

Затем сохраните в файл, используя File.WriteAllBytes.

Например:

var result = Compress(m).ToArray();
File.WriteAllBytes(@"d:\test.bin", result);
...