示例#1
0
        private int[] EncodeMessage(int[,] parityMatrix, int[] message, int gap, int oldGap)
        {
            int[,] p1 = null;

            int[,] messageArray = new int[1, message.Length];

            for (int i = 0; i < message.Length; i++)
            {
                messageArray[0, i] = message[i];
            }

            if (gap != 0)
            {
                int startRow = parityMatrix.GetLength(0) - gap;

                int[,] DMatrix = new int[gap, gap];

                int[,] CMatrix = new int[gap, parityMatrix.GetLength(1) - DMatrix.GetLength(1) - parityMatrix.GetLength(0) + gap];

                for (int i = startRow; i < parityMatrix.GetLength(0); i++)
                {
                    for (int j = 0; j < parityMatrix.GetLength(1) - parityMatrix.GetLength(0) + gap; j++)
                    {
                        if (j < CMatrix.GetLength(1))
                        {
                            CMatrix[i % startRow, j] = parityMatrix[i, j];
                        }
                        else
                        {
                            DMatrix[i % startRow, j % CMatrix.GetLength(1)] = parityMatrix[i, j];
                        }
                    }
                }

                int[,] DCMatrix = MatrixOperation.LogicMultiplicateMatrixes(MatrixOperation.LogicGetInverseMatrix(DMatrix), CMatrix);

                p1 = MatrixOperation.Transponse(MatrixOperation.LogicMultiplicateMatrixes(DCMatrix, MatrixOperation.Transponse(messageArray)));
            }
            else
            {
                p1 = new int[1, oldGap];
            }

            int[,] BMatrix = new int[parityMatrix.GetLength(0) - gap, oldGap];

            int[,] TMatrix = new int[parityMatrix.GetLength(0) - gap, parityMatrix.GetLength(0) - gap];

            int[,] AMatrix = new int[BMatrix.GetLength(0), parityMatrix.GetLength(1) - BMatrix.GetLength(1) - TMatrix.GetLength(1)];

            for (int i = 0; i < AMatrix.GetLength(0); i++)
            {
                for (int j = 0; j < parityMatrix.GetLength(1); j++)
                {
                    if (j < AMatrix.GetLength(1))
                    {
                        AMatrix[i, j] = parityMatrix[i, j];
                    }
                    else if (j < AMatrix.GetLength(1) + BMatrix.GetLength(1))
                    {
                        BMatrix[i, j % AMatrix.GetLength(1)] = parityMatrix[i, j];
                    }
                    else
                    {
                        TMatrix[i, j % (AMatrix.GetLength(1) + BMatrix.GetLength(1))] = parityMatrix[i, j];
                    }
                }
            }

            int[,] AuMatrix = MatrixOperation.LogicMultiplicateMatrixes(AMatrix, MatrixOperation.Transponse(messageArray));

            int[,] addedMatrixes = null;

            int[,] Bp1Matrix = MatrixOperation.LogicMultiplicateMatrixes(BMatrix, MatrixOperation.Transponse(p1));

            addedMatrixes = MatrixOperation.LogicAddUpMatrixes(AuMatrix, Bp1Matrix);

            int[,] p2 = MatrixOperation.Transponse(MatrixOperation.LogicMultiplicateMatrixes(MatrixOperation.LogicGetInverseMatrix(TMatrix), addedMatrixes));

            int[] codeword = new int[message.Length + p1.GetLength(1) + p2.GetLength(1)];

            for (int i = 0; i < codeword.Length; i++)
            {
                if (i < message.Length)
                {
                    codeword[i] = message[i];
                }
                else if (i < message.Length + p1.GetLength(1))
                {
                    codeword[i] = p1[0, i % message.Length];
                }
                else
                {
                    codeword[i] = p2[0, i % (message.Length + p1.GetLength(1))];
                }
            }

            return(codeword);
        }
示例#2
0
        private bool DecodeMessage(int[] codeword, int[,] parityMatrix, float rank, out int[] originalMessage)
        {
            int[] finalCodeWord = new int[codeword.Length];

            bool isSindromConfirmed = false;

            int[,] parityMatrixTransposed = MatrixOperation.Transponse(parityMatrix);

            int[] syndrome = MatrixOperation.LogicMultiplicateVectorMatrix(codeword, parityMatrixTransposed);

            for (int i = 0; i < syndrome.Length; i++)
            {
                if (syndrome[i] == 1)
                {
                    isSindromConfirmed = true;

                    break;
                }
            }

            Console.WriteLine("Синдром = " + isSindromConfirmed);

            if (!isSindromConfirmed)
            {
                originalMessage = new int[(int)(codeword.Length * rank)];

                for (int i = 0; i < originalMessage.Length; i++)
                {
                    originalMessage[i] = codeword[i];
                }

                return(isSindromConfirmed);
            }

            int[] F = MatrixOperation.MultiplicateVectorMatrix(syndrome, parityMatrix);

            int threshold = 0;

            int[] codewordCopy = (int[])codeword.Clone();

            for (int i = 0; i < F.Length; i++)
            {
                if (threshold < F[i])
                {
                    threshold = F[i];
                }
            }

            Console.WriteLine("Порог " + threshold);

            for (int i = 0; i < F.Length; i++)
            {
                if (F[i] >= threshold)
                {
                    Console.WriteLine("Исправление в {0} элементе", i);

                    codewordCopy[i] = (codewordCopy[i] + 1) % 2;

                    break;
                }
            }

            originalMessage = codewordCopy;

            Console.WriteLine("Новое кодовое слово");

            for (int i = 0; i < codewordCopy.Length; i++)
            {
                Console.Write(codeword[i] + " ");
            }
            Console.WriteLine();

            return(isSindromConfirmed);
        }