// массив байт => массив бит
 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;
        }