将 BitArray.Length 设置为较低的值并不总是会更改内部 "m_array" 这一事实有什么解决方法?

What is a work around for the fact that setting BitArray.Length to a lower value doesn't always change internal "m_array"?

澄清:System.Collections.BitArray

当我说 "doesn't always" 时,我并不是说它是随机的或看似随机的,当长度减少时新长度在 "some number" 的较低倍数内似乎是一致的(我不知道,可能是 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 ), 就是这样, 但是这个"m_array"里面还是保存了15的内部值, 好像是确定了第二种方法中byteArray中复制的值!

我想到的解决方法有两种:

    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))