// массив байт => массив бит public static bool[] BytesToBits(byte[] source) { List<bool> result = new List<bool>(); foreach (byte b in source) { result.AddRange(ByteToEightBits(b)); } return result.ToArray(); }
// массив бит => массив байт public static byte[] BitsToBytes(bool[] source) { List<byte> listOfBytes = new List<byte>(); List<bool> listOfBools = source.ToList(); try { do { bool[] eightBits = listOfBools.Take(8).ToArray(); listOfBools.RemoveRange(0, 8); listOfBytes.Add(EightBitsToByte(eightBits)); } while (listOfBools.Count != 0); } catch (ArgumentException) { listOfBools.AddRange(new bool[8 - listOfBools.Count]); bool[] eightBits = listOfBools.ToArray(); listOfBytes.Add(EightBitsToByte(eightBits)); } return listOfBytes.ToArray(); }
//получение вектора изображения public static object[] GetVector(List<byte[,]> G, List<byte[,]> G1) { if (G.Count != G1.Count) throw (new ArgumentException("G and G1 have a different number of blocks")); List<bool> RS = new List<bool>(0); //хранит тип каждого блока. R-true,S-false,U-dont has value bool?[] blockType = new bool?[G.Count]; for (int i = 0; i < G.Count; i++) { int GSum = Discriminate(G[i]); int G1Sum = Discriminate(G1[i]); if (GSum != G1Sum) { RS.Capacity++; if (G1Sum > GSum) { RS.Add(true); blockType[i] = true; } else { RS.Add(false); blockType[i] = false; } } } object[] obj = { RS.ToArray(), blockType }; return obj; }