将BitArray.Length设置为较低值并不总是改变内部“m_array”的事实是什么?

时间:2018-05-16 14:01:39

标签: c# binary converter

澄清:System.Collections.BitArray

当我说“并不总是”时,我并不是说它是随机的或看似随机的,当长度减小使得新长度在“某个数字”的较低倍数内时似乎是一致的(不是我知道,可能8)然后内部“m_array”按预期收缩。

我正在制作需要任意位数的数据,0-65535之间的任何数据,我需要能够将无符号,有符号,双精度,浮点数和字符串转换为BitArrays并返回。由于各种原因,图书馆也是不可能的。

我需要一个解决方法,因为缺少BitArray.Length的(非常)意外行为。

这是一个什么时候不起作用的例子:

[Route("GetTestFile")]
[HttpGet]
public IActionResult GetTestFile()
{
    var fileName = "testdata.csv";
    var filePath = Path.Combine("Data", fileName);
    try
    {
        return new FileContentResult(File.ReadAllBytes(filePath), "text/csv") { FileDownloadName = fileName };
    }
    catch (Exception)
    {
        // Return the error message like "File not found" instead of `fileName`. 
        // Returning the file path here is just for getting quick details.
        return new StatusCode(filePath)
        {
            StatusCode = 500
        };
    }
}

所以当我调用[Route("GetTestFile")] [HttpGet] public IActionResult GetTestFile() { var fileName = "testdata.csv"; var filePath = Path.Combine("Data", fileName); try { return new FileContentResult(File.ReadAllBytes(filePath), "text/csv") { FileDownloadName = fileName }; } catch (Exception exception) { var errorMessage = $"Can not read CSV file {fileName}."; Log(errorMessage, exception); return StatusCode((int)HttpStatusCode.InternalServerError, errorMessage); } } 时我应该得到7,因为15被转换为true,true,true,true,true(11111),然后应该变为true,true,true(111),它是什么,但15的内部值仍然存储在这个“m_array”中,这似乎决定了第二种方法中byteArray中的复制值!

1 个答案:

答案 0 :(得分:0)

我提出的解决方案有两种方法:

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

用SetBitArrayLength替换长度赋值,它按原来的预期工作,调用BitArrayToLong(BitArrayFromLong(15))时返回7