我有一个BitArray
长度为8,我需要一个函数将其转换为byte
.怎么做?
具体来说,我需要一个正确的功能ConvertToByte
:
BitArray bit = new BitArray(new bool[] { false, false, false, false, false, false, false, true }); //How to write ConvertToByte byte myByte = ConvertToByte(bit); var recoveredBit = new BitArray(new[] { myByte }); Assert.AreEqual(bit, recoveredBit);
Jon Skeet.. 49
这应该工作:
byte ConvertToByte(BitArray bits) { if (bits.Count != 8) { throw new ArgumentException("bits"); } byte[] bytes = new byte[1]; bits.CopyTo(bytes, 0); return bytes[0]; }
记住:这会以相反的顺序计算位,例如,示例中的BitArray将转换为128,而不是1! (11认同)
@kornelijepetak:重要的是它以相反的顺序复制.如果在其他类型上使用BitConverter,则它们以little-endian格式存储. (4认同)
绘制字节字节序和位字节序之间的区别非常重要.位字节序告诉您每个字节中位的排序以及第一位是最高位还是最低位.字节字节顺序告诉您字中字节的预期顺序.位字节顺序通常总是被描述为"LSB优先"或"MSB优先"而不是小端或大端... (2认同)
Tedd Hansen.. 34
有点晚了,但这对我有用:
public static byte[] BitArrayToByteArray(BitArray bits) { byte[] ret = new byte[(bits.Length - 1) / 8 + 1]; bits.CopyTo(ret, 0); return ret; }
适用于:
string text = "Test"; byte[] bytes = System.Text.Encoding.ASCII.GetBytes(text); BitArray bits = new BitArray(bytes); bytes[] bytesBack = BitArrayToByteArray(bits); string textBack = System.Text.Encoding.ASCII.GetString(bytesBack); // bytes == bytesBack // text = textBack
.
这应该工作:
byte ConvertToByte(BitArray bits) { if (bits.Count != 8) { throw new ArgumentException("bits"); } byte[] bytes = new byte[1]; bits.CopyTo(bytes, 0); return bytes[0]; }
有点晚了,但这对我有用:
public static byte[] BitArrayToByteArray(BitArray bits) { byte[] ret = new byte[(bits.Length - 1) / 8 + 1]; bits.CopyTo(ret, 0); return ret; }
适用于:
string text = "Test"; byte[] bytes = System.Text.Encoding.ASCII.GetBytes(text); BitArray bits = new BitArray(bytes); bytes[] bytesBack = BitArrayToByteArray(bits); string textBack = System.Text.Encoding.ASCII.GetString(bytesBack); // bytes == bytesBack // text = textBack
.
一个穷人的解决方案:
protected byte ConvertToByte(BitArray bits) { if (bits.Count != 8) { throw new ArgumentException("illegal number of bits"); } byte b = 0; if (bits.Get(7)) b++; if (bits.Get(6)) b += 2; if (bits.Get(5)) b += 4; if (bits.Get(4)) b += 8; if (bits.Get(3)) b += 16; if (bits.Get(2)) b += 32; if (bits.Get(1)) b += 64; if (bits.Get(0)) b += 128; return b; }