代码之家  ›  专栏  ›  技术社区  ›  Pavan Chandaka

BitArray的Int64转换值与“SetAll”不同。有什么原因吗?

  •  0
  • Pavan Chandaka  · 技术社区  · 4 年前

    在第一个场景中,(下面)最后的整数值是255(使用 BitArray.SetAll(Boolean)

    在第二个场景中,最终的整数值是3(这是正确的。设置每个索引的位。)

    我的期望是两个都应该表现得一样。但不是。有什么具体原因吗?

    BitArray myBA = new BitArray(2);
    myBA.SetAll(true);            
    byte[] byteArray = new byte[8];
    myBA.CopyTo(byteArray, 0);
    Int64 finalInt = BitConverter.ToInt64(byteArray,0); //finalInt = 255
    

    场景2:

    BitArray myBA = new BitArray(2);
    myBA[0] = true;
    myBA[1] = true;
    byte[] byteArray = new byte[8];
    myBA.CopyTo(byteArray, 0);
    Int64 finalInt = BitConverter.ToInt64(byteArray,0); //finalInt = 3 (which is expected.)
    
    1 回复  |  直到 4 年前
        1
  •  3
  •   Sweeper    4 年前

    试试这个代码 .netfiddle :

    BitArray myBA = new BitArray(2);
    myBA.SetAll(true);            
    byte[] byteArray = new byte[8];
    //myBA.Length++;
    myBA.CopyTo(byteArray, 0);
    Int64 finalInt = BitConverter.ToInt64(byteArray,0);
    Console.WriteLine(finalInt);
    

    但是,如果只增加 Length

    这说明这是.NET框架中的一个bug。另外,如果您将框架切换到.NET5或.NETCore,那么即使不增加 长度 .

    查看的源代码 .NET framework .NET Core ,我想是这样的:

    SetAll(true) int 在底层 int[] -1 (均为1),无论 长度 位数组的。只有当你增加 它“添加”了一个新的0。 CopyTo 在.NET框架中,似乎没有考虑到 长度 方法 在.NET核心中 does consider this :

    // last byte is not aligned, we will directly copy one less byte
    

    还有925号线:

    // mask the final byte