byte [] to bool []用作标志,反之亦然

时间:2016-01-23 11:34:14

标签: c# boolean bytearray bits bitarray

好的,所以我有一个使用的字节[] File.ReadAllBytes(filename); 我的问题是我的程序需要将文件中的数据视为一组bool。 我搜索过,但我没有找到一种方法来获得正确有效的转换。 一个例子是:

{ 00101011, 10111010 } ->
            { false, false, true, false, true, false, false, true, true,
              false, true, true, true, false, true, false }

我还需要改变程序。

我遇到的大多数解决方案涉及从每个字节中获取一个布尔值。即,bool[]的结果数组与byte[]数组的长度相同,我似乎不明白这是怎么可能的,8位如何只产生一个布尔值? 在我的情况下,我需要一个结果数组:bool[bytes.Length * 8].

非常感谢,非常感谢任何帮助。

实现其中一个解决方案我试图让它工作,但它有点错误,因为生成的文件,我读取的文件的副本被损坏:

public static bool[] boolsFromFile(string filename)
    {
        List<bool> b = new List<bool>();
        using (FileStream fileStream = new FileStream(filename, FileMode.Open))
        using (BinaryReader read = new BinaryReader(fileStream))
        {
            while (fileStream.Position != fileStream.Length)
                b.Add(read.ReadBoolean());
        }
        return b.ToArray();
    }

    public static void boolsToFile(string filename, bool[] bools)
    {
        using (FileStream fileStream = new FileStream(filename, FileMode.Create))
        using (BinaryWriter write = new BinaryWriter(fileStream))
        {
            foreach (bool b in bools)
                write.Write(b);
        }
    }

2 个答案:

答案 0 :(得分:6)

A .NET bool "wastes" seven bits。所以没有直接的方法可以从一个字节转到八个布尔值。

您可以使用BitArray class,请参阅Converting C# byte to BitArray

这样的事情:

var bytes = File.ReadAllBytes(filename);
var bitArray = new BitArray(bytes);
bool ninthBit = bitArray[8];

答案 1 :(得分:0)

使用Linq轻松

            byte[] input = new byte[] { 0x2b, 0xba };
            Boolean[][] results = input.Select(x => Enumerable.Repeat(x,8).Select((y, i) => ((y >> (7 - i)) & 1) == 0 ? false : true).ToArray()).ToArray();