如何转换一个字节的bool数组,然后再转换回bool数组
本文关键字:数组 bool 转换 然后 一个 何转换 字节 | 更新日期: 2023-09-27 18:09:43
我想在一个字节中打包最大长度为8的bool数组,通过网络发送,然后将其解包回bool数组。这里已经尝试了一些解决方案,但没有奏效。我用单声道。
我创建了BitArray,然后尝试将其转换为byte
public static byte[] BitArrayToByteArray(BitArray bits)
{
byte[] ret = new byte[Math.Max(1, bits.Length / 8)];
bits.CopyTo(ret, 0);
return ret;
}
但是我得到的错误告诉只有int和long类型可以使用。尝试int代替字节,但同样的问题。如果可能的话,我想避免BitArray并使用从bool数组到字节的简单转换
我将如何实现它。
将bool[]
转换为byte
:
private static byte ConvertBoolArrayToByte(bool[] source)
{
byte result = 0;
// This assumes the array never contains more than 8 elements!
int index = 8 - source.Length;
// Loop through the array
foreach (bool b in source)
{
// if the element is 'true' set the bit at that position
if (b)
result |= (byte)(1 << (7 - index));
index++;
}
return result;
}
将字节转换为长度为8的bool数组:
private static bool[] ConvertByteToBoolArray(byte b)
{
// prepare the return result
bool[] result = new bool[8];
// check each bit in the byte. if 1 set to true, if 0 set to false
for (int i = 0; i < 8; i++)
result[i] = (b & (1 << i)) != 0;
// reverse the array
Array.Reverse(result);
return result;
}
其他静态函数版本
/// <summary>
/// Convert Byte Array To Bool Array
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static bool[] ConvertByteArrayToBoolArray(byte[] bytes)
{
System.Collections.BitArray b = new System.Collections.BitArray(bytes);
bool[] bitValues = new bool[b.Count];
b.CopyTo(bitValues, 0);
Array.Reverse(bitValues);
return bitValues;
}
/// <summary>
/// Packs a bit array into bytes, most significant bit first
/// </summary>
/// <param name="boolArr"></param>
/// <returns></returns>
public static byte[] ConvertBoolArrayToByteArray(bool[] boolArr)
{
byte[] byteArr = new byte[(boolArr.Length + 7) / 8];
for (int i = 0; i < byteArr.Length; i++)
{
byteArr[i] = ReadByte(boolArr, 8 * i);
}
return byteArr;
}
无数组。反向版本:
public static void Byte2Flags(bool[] flags, byte range)
{
if (flags == null || flags.Length < 8)
{
return;
}
for (int i = 0; i < 8; i++)
flags[i] = (range & (1 << i)) > 0;
}
public static byte Flags2Byte(bool[] flags)
{
byte range = 0;
if (flags == null || flags.Length < 8)
{
range = 0;
}
for (int i = 0; i < 8; i++)
{
if (flags[i])
{
range |= (byte)(1 << i);
}
}
return range;
}
和如何测试:
bool[] flags = new bool[8];
byte b;
for(int i = 0; i < 256; i++)
{
b = (byte)i;
Byte2Flags(flags, b);
byte back = Flags2Byte(flags);
if(b != back)
{
//Not Match!
}
}
这里有一系列的方法来做这些
using System;
using System.Text;
public class Program
{
public void Main(){
byte _num = 1;
Console.WriteLine(ReadAllBits(WriteBools(new bool[] {true,true,false,false,false,false,false,true})));
}
public string ReadAllBits(byte _mask){
string _data = "";
for(int i = 0; i < 8; i++){
if((_mask& (1<<i)) !=0){
_data += "1";
}else{
_data+="0";
}
}
return _data;
}
public bool[] GetBools(byte _mask){
bool[] _values = new bool[8];
for(int i = 0; i < 8; i++){
if((_mask& (1<<i)) !=0){
_values[i] = true;
}else{
_values[i] = false;
}
}
return _values;
}
public byte WriteBools(bool[] _data){
byte _byte = 0;
for(int i = 0; i < 8; i++){
if(_data[i]){
_byte = System.Convert.ToByte(( _byte | (1<<i)));
}
}
return _byte;
}
}
你可以在这里找到完整的要点https://gist.github.com/namusanga/abecca458a3a15ca9bfa6fcdd7953e31