Какой обходной путь для того факта, что установка BitArray.Length на более низкое значение не всегда меняет внутренний "m_array"? - PullRequest
0 голосов
/ 16 мая 2018

Чтобы уточнить: System.Collections.BitArray

Когда я говорю «не всегда», я не говорю, что это случайный или кажущийся случайным, кажется последовательным, что когда длина уменьшается так, что новая длина находится в пределах меньшего кратного «некоторого числа» (не мне известно, возможно 8) тогда внутренний "m_array" сжимается как ожидалось.

Я делаю что-то, что требует данных с произвольным числом битов, от 0 до 65535, и мне нужно иметь возможность превращать беззнаковые, знаковые, двойные, с плавающей точкой и строки в BitArrays и обратно. Библиотеки также не обсуждаются по разным причинам.

Мне нужно обойти это, так как (крайне) неожиданное поведение BitArray.Length отсутствует.

Вот пример того, когда это не сработает:

    private const int _lengthInBits = 3; //not actually a const in program

    private BitArray BitArrayFromLong(long lng)
    {
        return new BitArray(BitConverter.GetBytes(lng)) { Length = _lengthInBits };
    }

    private long BitArrayToLong(BitArray bitArray)
    {
        bitArray.Length = _lengthInBits; //this shouldn't be required but didn't think it would hurt
        var byteArray = new byte[sizeof(long)];
        bitArray.CopyTo(byteArray, 0);
        return BitConverter.ToInt64(byteArray, 0);
    }

Поэтому, когда я звоню BitArrayToLong(BitArrayFromLong(15)), я ДОЛЖЕН получить 7, потому что 15 преобразуется в true, true, true, true, true (11111), которые затем ДОЛЖНЫ быть преобразованы в true, true, true (111), которые есть, но внутреннее значение 15 все еще сохраняется в этом «m_array», который, кажется, определяет скопированное значение в byteArray во втором методе!

1 Ответ

0 голосов
/ 16 мая 2018

Решение, которое я придумал, было двумя способами:

    private static void SetBitArrayLength(ref BitArray bitArray, ushort newLength)
    {
        bitArray.Length = newLength;
        RepairBitArray(ref bitArray);
    }

    private static void RepairBitArray(ref BitArray bitArray)
    {
        var returnBitArray = new BitArray(bitArray.Length);
        for (var index = 0; index < bitArray.Length; index++)
        {
            returnBitArray[index] = bitArray[index];
        }
        bitArray = returnBitArray;
    }

Замените присвоение длины на SetBitArrayLength, и оно будет работать, как и ожидалось, 7 возвращается при вызове BitArrayToLong(BitArrayFromLong(15))

...