位未按预期打开

Bit isn't on as expected

我正在通过以下方法将数字转换为 byte 数组:

var bytes = new Span<byte>(new byte[4]);
BinaryPrimitives.WriteInt32BigEndian(bytes.ToArray(), <my-number>);

然后我将 byte 数组转换为 BitArray(用于测试目的)。

var arr = new BitArray(bytes);

并进行测试以确保最后一位已打开(我将其用作标志)。

Assert.True(arr[^1]);

然而,这是返回错误。这对我来说没有意义,因为我在数组中的最后一个 byte 的值为 29。如果我没有想错的话,它应该是 00011101 —— 最后一位已打开。

让我更加困惑的是,如果我使用 WriteInt32*Little*Endian,位置 0 的位正如我所期望的那样打开。

我确定这很简单,但我对为什么我的最后一点没有按预期打开感到非常困惑。

编辑:按要求提供可测试格式的代码。

var bytes = new Span<byte>(new byte[4]);
BinaryPrimitives.WriteInt32BigEndian(bytes, 1023773);
var arr = new BitArray(bytes.ToArray());
Assert.True(arr[^1]);

有时候检查文档是值得的...

For BitArray(byte[]):

The first byte in the array represents bits 0 through 7, the second byte represents bits 8 through 15, and so on.

因此,当您获得大端字节时,BitArray 构造函数实际上是小端字节:最不重要的字节首先传递。

这解释了为什么 WriteInt32LittleEndian 按您的预期执行:它以与 BitArray 预期相同的字节顺序生成字节。