【问题标题】:How to convert Bit Array to byte , when bit array has only 5 bits or 6bits如何将位数组转换为字节,位数组只有 5 位或 6 位
【发布时间】:2014-05-08 07:57:42
【问题描述】:

我已经为此编写了一个程序,仅当位数组长度为 8 的倍数时才有效。 有人可以帮我将 5 位的位数组转换为字节吗

这两个函数只有在它的位数组是 8 的倍数时才起作用。

public static byte[] BitArrayToByteArray(BitArray bits)
        {
            byte[] ret = new byte[bits.Length / 8];
            bits.CopyTo(ret, 0);
            return ret;
        }


public static byte[] ToByteArray(this BitArray bits)
        {
            int numBytes = bits.Count / 8;
            if (bits.Count % 8 != 0) numBytes++;

            byte[] bytes = new byte[numBytes];
            int byteIndex = 0, bitIndex = 0;

            for (int i = 0; i < bits.Count; i++)
            {
                if (bits[i])
                    bytes[byteIndex] |= (byte)(1 << (7 - bitIndex));

                bitIndex++;
                if (bitIndex == 8)
                {
                    bitIndex = 0;
                    byteIndex++;
                }
            }
            return bytes;
        }

【问题讨论】:

  • 请注意:数组中的第一个字节表示位 0 到 7,第二个字节表示位 8 到 15,依此类推。每个字节的 Least Significant Bit 表示最低索引值:“bytes [0] & 1”表示第 0 位,“bytes [0] & 2”表示第 1 位,“bytes [0] & 4”表示第 2 位,以及很快。 (来自:msdn.microsoft.com/en-us/library/x1xda43a.aspx

标签: c# .net type-conversion byte bitarray


【解决方案1】:

基本上,您需要将第一种方法所需的字节数四舍五入:

byte[] ret = new byte[(bits.Length + 7) / 8];
bits.CopyTo(ret, 0);

您的第二种方法乍一看似乎还不错……它确实填充了正确的字节数。它可能不会以您想要的方式填充它们,但在这种情况下,您需要提供更多关于您希望如何填充它们的详细信息。例如,您可能只想更改 bitIndex 的初始值。 (示例输入和输出将非常有用。)

【讨论】:

  • 我认为(使用适当的演员表)Math.Ceiling(bits.Length / 8d) 将是等效的(IMO 更清晰的意图,演员表除外)
  • @TimS.:可能 - 这是我倾向于这样做的方式,因为我不需要考虑任何细节。当然,如果您经常这样做,很容易将其提取为扩展方法。
  • @TimS.:二进制或十进制,转换为浮点很昂贵,浮点除法也是如此。对于这样一个微不足道的操作,这样做只是为了您可以使用ceil() 是......过度杀伤力。整数除法也表达了意图(bettin,恕我直言):bits.Length / 8 + (bits.Length % 8 ? 1 : 0 )。由于您的听众在这里是小玩意儿,并且您正在处理 2 的幂,因此请完全避免除法运算。说出您的听众的语言并按自己的方式进行位旋转以达到所需的字节数:bits.Length&gt;&gt;3 + ((bits.Length&amp;7) == 0 ? 0 : 1 )
猜你喜欢
  • 2011-02-02
  • 2019-12-13
  • 2018-05-06
  • 2010-09-26
  • 2010-10-17
  • 2018-07-16
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多