byte[] 到 bool[] 用作标志,反之亦然
byte[] to bool[] to use as flags and viceversa
好的,所以我有一个字节[]可以使用
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);
}
}
A .NET bool "wastes" seven bits。所以没有直接的方法从一个字节到八个布尔值。
您可以使用 BitArray class, see Converting C# byte to BitArray。
所以像这样:
var bytes = File.ReadAllBytes(filename);
var bitArray = new BitArray(bytes);
bool ninthBit = bitArray[8];
使用 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();
好的,所以我有一个字节[]可以使用
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);
}
}
A .NET bool "wastes" seven bits。所以没有直接的方法从一个字节到八个布尔值。
您可以使用 BitArray class, see Converting C# byte to BitArray。
所以像这样:
var bytes = File.ReadAllBytes(filename);
var bitArray = new BitArray(bytes);
bool ninthBit = bitArray[8];
使用 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();