位未按预期打开
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]);
有时候检查文档是值得的...
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
预期相同的字节顺序生成字节。
我正在通过以下方法将数字转换为 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]);
有时候检查文档是值得的...
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
预期相同的字节顺序生成字节。