2016-01-23 112 views
4

好的,所以我有一个字节[],我得到使用 File.ReadAllBytes(filename); 我的问题是,我的程序需要将数据从文件作为数组布尔变量。 我已经搜索,但我没有设法找到一种方法来获得正确和高效的转换。 一个例子是:byte [] to 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].

非常感谢,任何帮助,高度赞赏。

实现我tryed得到这个工作的解决方案之一,但它是某种错误的,因为生成的文件,这是我读的文件的副本被损坏:

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); 
     } 
    } 
+0

尝试使用[位运算(http://www.tutorialspoint.com/csharp/csharp_bitwise_operators.htm)。 – Archimaredes

+0

该文件是如何制作的。如果该文件是用BinaryWriter制作的,用BinaryReader读取该文件将是显而易见的。 –

+1

@Esben建议以与写入文件相同的方式读取文件是一个好的方法,但是BinaryWriter [也将bools写入为字节以及](http://stackoverflow.com/questions/10057747/write-one-single-bit -to-二进制文件使用-的BinaryWriter)。 – CodeCaster

回答

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(); 
+0

我会说这可能很容易,但它肯定是不可读的。他正在寻找一个BitMask @ CodeCaster的解决方案似乎更合适,并且可读性更高。 –

+0

不要在这种情况下猜测这个人想要什么。如果他正在寻找一个掩码,那么完全没有理由进行任何转换。一个字节是一个掩码。 – jdweng

+0

没错,但是为什么要经过一个复杂的linq,当有更简单的工作时呢? –