C# 的 BitArray.LeftShift 似乎正在更改每个字节内的低位?

问题描述 投票:0回答:1

在手动索引 BitArray 以左移它时遇到麻烦后,我在 C# 的官方文档中发现有一个 BitArray.LeftShift() 函数(https://learn.microsoft.com/en-us/dotnet/api/ system.collections.bitarray.leftshift?view=net-7.0).

然而,在实现它并经历了很多令人头疼的困惑之后,我开始意识到该功能似乎并没有按照我理解的方式工作。对于大小为 32 的位数组,它似乎正在以我不理解的方式处理位移位,我最好的猜测是系统架构类型的问题?但我不知道。

我有以下代码:


    byte[] a = new byte[4] {0xff, 0xff, 0xff, 0x0f};
    BitArray bitArray = new BitArray(a);
    Console.WriteLine(BitConverter.ToString(sha_1.ConvertToByteArray(bitArray)));
    bitArray.LeftShift(1);
    Console.WriteLine(BitConverter.ToString(sha_1.ConvertToByteArray(bitArray)));


其中 sha_1.ConvertToByteArray() 是我从 Stack Overflow 上抓取的一个函数,它本质上只是将位数组转换回字节数组。如果需要,我可以发布该代码,但它似乎与第一个打印语句配合得很好,我不认为这是问题所在。

我的输出让我困惑了一段时间。

我期望左移后有:

FF-FF-FE-1F
FF-FF-FE-1E

取决于最右边位的处理,但我的完整输出,包括第一个打印行,是:

FF-FF-FF-0F
FE-FF-FF-1F

在玩了一些并移动 0 之后,似乎出现了奇怪的模式,其中 F 值翻转为 E,例如将 a 更改为 {0xff, 0xff, 0x0f, 0xff} 会产生

FF-FF-0F-FF
FE-FF-1F-FE

有人了解这个问题或有解决方案吗?我可能会尝试转换为常规数组,因为我之前在索引方面遇到了麻烦,但我想我应该在这里询问这个函数,因为我对其行为感到非常困惑。

c# arrays endianness bit-shift bitarray
1个回答
0
投票

BitArray(Byte[]) 构造函数期望您给它的字节按照从最低有效到最高有效的顺序排列,而不是从最高有效到最低有效的顺序。所以数组

new byte[4] {0xff, 0xff, 0xff, 0x0f}
 被解释为 0F-FF-FF-FF(最高有效位到最低有效位),当您将其左移一位时,结果是 1F-FF-FF-FE。

要获得您期望的左移行为,请反转数组中的值。 (您还需要调整 BitArray 到字符串的逻辑并反转字节。)

© www.soinside.com 2019 - 2024. All rights reserved.