【问题标题】:byte[] to bool[] to use as flags and viceversabyte[] 到 bool[] 用作标志,反之亦然
【发布时间】:2016-04-30 00:15:25
【问题描述】:

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

{ 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);
        }
    }

【问题讨论】:

  • 尝试使用bitwise operations
  • 文件最初是如何制作的。如果文件是使用 BinaryWriter 制作的,那么使用 BinaryReader 读取文件是显而易见的。
  • @Esben 建议以与写入文件相同的方式读取文件,但 BinaryWriter writes bools as bytes as well.
  • @CodeCaster 是的,我试过这个,我认为这是我最好的机会。我设法读取一个文件并重写一个新副本,我写的新文件大小完全相同,但不知何故损坏了。我会错过什么吗?

标签: c# boolean bytearray bits bitarray


【解决方案1】:

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];

【讨论】:

    【解决方案2】:

    使用 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();
    

    【讨论】:

    • 我会说这可能很容易,但它肯定不可读。他正在寻找一个 BitMask。@CodeCaster 的解决方案似乎更合适,更易读。
    • 在这种情况下不要猜测对方想要什么。如果他正在寻找一个位掩码,那么绝对没有理由进行任何转换。一个字节就是一个掩码。
    • 是的,但是当有更简单的东西可以使用时,为什么要通过复杂的 linq 呢?
    • 我不能回答你的问题,只有写这个问题的人才能回答。他说他需要一个布尔数组,所以我给了他一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多