为了账号安全,请及时绑定邮箱和手机立即绑定

将 BitArray 转换为字节

将 BitArray 转换为字节

C#
HUX布斯 2023-08-13 09:38:20
BitArray我有一个将值转换为值的代码byte[]。我也从 stackoverflow 获得了代码。代码运行得很好,我只是不明白一部分。当代码复制到BitArray使用Byte读取BitArray.CopyTo()时byte按LSB 顺序。有人可以帮我理解为什么转换后的字节是 LSB 顺序吗?strBit (is a string value that consists of 1/0)byte[] myByte = new byte[50];List<string> list = Enumerable.Range(0, strBit.Length / 8)    .Select(i => strBit.Substring(i * 8, 8))    .ToList();for (int x = 0; x < list.Count; x++){    BitArray myBitArray = new BitArray(list[x].ToString().Select(c => c == '1').ToArray());    myBitArray.CopyTo(myByte, x);}示例输出:  strBit[0] = 10001111  (BitArray)转换为字节时:  myByte[0] = 11110001 (Byte) (241/F1)
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

因为我们从右边开始计算位,从左边开始计算项目;例如对于


 BitArray myBitArray = new BitArray(new byte[] { 10 });

我们有(byte 10从右数):


 10 = 00001010 (binary)

            ^

            second bit (which is 1)

当相应数组的项目我们从左边开始计数时:


 {false, true, false, true, false, false, false, false}

           ^

           corresponding second BitArray item (which is true)

这就是为什么如果我们想要一个byte后面的数组,我们必须Reverse每个byte表示,例如Linq解决方案


  using System.Collections;

  using System.Linq;


  ...


  BitArray myBitArray = ...


  byte[] myByte = myBitArray

    .OfType<bool>()

    .Select((value, index) => new { // into chunks of size 8

       value,

       chunk = index / 8 })

    .GroupBy(item => item.chunk, item => item.value)

    .Select(chunk => chunk // Each byte representation

      .Reverse()           // should be reversed   

      .Aggregate(0, (s, bit) => (s << 1) | (bit ? 1 : 0)))

    .Select(item => (byte) item)

    .ToArray();


查看完整回答
反对 回复 2023-08-13
  • 1 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信