将 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))
澄清: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))