澄清: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中的复制值!
答案 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