【问题标题】:BitArray stores bits in reverse order when initialized with an Int32 array使用 Int32 数组初始化时,BitArray 以相反的顺序存储位
【发布时间】:2015-06-09 19:41:45
【问题描述】:

描述我的错误理解的最佳方式是使用代码本身:

var emptyByteArray = new byte[2];

var specificByteArray = new byte[] {150, 105}; //0x96 = 150, 0x69 = 105
var bitArray1 = new BitArray(specificByteArray);
bitArray1.CopyTo(emptyByteArray, 0); //[0]: 150, [1]:105

var hexString = "9669";
var intValueForHex = Convert.ToInt32(hexString, 16); //16 indicates to convert from hex
var bitArray2 = new BitArray(new[] {intValueForHex}) {Length = 16}; //Length=16 truncates the BitArray

bitArray2.CopyTo(emptyByteArray, 0); //[0]:105, [1]:150 (inversed, why??)

我一直在阅读 bitarray 从 LSB 迭代到 MSB,那么从十六进制字符串开始初始化 bitarray 的最佳方法是什么?

【问题讨论】:

标签: c# endianness bitarray


【解决方案1】:

我认为你想错了。你为什么还要使用 BitArray? Endianness 是一个 byte-related 约定,BitArray 只是一个位数组。由于它是最不重要的位,因此在位数组中存储 32 位数字的正确方法是在索引 0 处使用位 0,在索引 31 处使用位 31。这不仅仅是我个人对小端序的偏见(为了上帝的缘故,位 0 应该在字节 0 而不是字节 3 中),这是因为 BitArray 将字节的位 0 存储在数组中的索引 0 处。它还将 32 位整数的第 0 位存储在数组的第 0 位中,无论您所在平台的字节顺序如何。

例如,不是你的整数 9669,让我们看看 1234。不管你在什么平台上,那个 16 位的数字都有以下位表示,因为我们用最高有效的十六进制数字写一个十六进制数字@987654321 @在左边,最低有效的十六进制数字4在右边,位0在右边(人类约定):

  1    2    3    4
0001 0010 0011 0100

无论架构如何排序字节,16 位数字的第 0 位始终表示最低有效位(此处为最右边),第 15 位表示最高有效位(此处为最左边) .因此,您的位数组将始终如此,左侧为位 0,因为这是我读取数组的方式(索引 0 为位 0,索引 15 为位 15):

---4--- ---3--- ---2--- ---1---
0 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0

您正在做的是将您想要的字节顺序强加到它不属于的位数组上。如果你想反转字节,那么你会在位数组中得到它,这不太有意义,这意味着当你取出整数时你必须再次反转字节:

---2--- ---1--- ---4--- ---3---
0 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0

我认为这对于存储整数没有任何意义。如果你想在 BitArray 中存储一个 32 位数字的大端表示,那么你真正存储的是一个字节数组,它恰好是一个 32 位数字的大端表示,你应该转换为字节数组在放入 BitArray 之前,如果需要,首先使其成为大端:

int number = 0x1234;
byte[] bytes = BitConverter.GetBytes(number);
if (BitConverter.IsLittleEndian)
{
    bytes = bytes.Reverse().ToArray();
}
BitArray ba = new BitArray(bytes);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2015-03-03
    • 1970-01-01
    • 2011-11-06
    • 2020-02-17
    相关资源
    最近更新 更多