Ejemplo n.º 1
0
        private static bool is_codeword_valid(int[] codeword)
        {
            int sum = 0;

            for (int i = 1; i < 5; i++)
            {
                int t = 0;

                for (int j = 0; j < 31; j++)
                {
                    if (j > 12 && j < 27)
                    {
                        continue;
                    }

                    int pos = j;
                    if (j > 26)
                    {
                        pos -= 14;
                    }

                    t ^= ReedSolomon.gmult(codeword[pos], ReedSolomon.gexp[(i * j) % 31]);
                }

                sum |= t;
            }

            return(sum == 0);
        }
Ejemplo n.º 2
0
        public static String Encode(ulong plain)
        {
            String plain_string = Convert.ToString(plain);
            int    length       = plain_string.Length;

            int[] plain_string_10 = new int[ReedSolomon.base_10_length];
            for (int i = 0; i < length; i++)
            {
                plain_string_10[i] = (int)plain_string[i] - (int)'0';
            }

            int codeword_length = 0;

            int[] codeword = new int[ReedSolomon.initial_codeword.Length];

            do
            {  // base 10 to base 32 conversion
                int new_length = 0;
                int digit_32   = 0;
                for (int i = 0; i < length; i++)
                {
                    digit_32 = digit_32 * 10 + plain_string_10[i];
                    if (digit_32 >= 32)
                    {
                        plain_string_10[new_length] = digit_32 >> 5;
                        digit_32   &= 31;
                        new_length += 1;
                    }
                    else if (new_length > 0)
                    {
                        plain_string_10[new_length] = 0;
                        new_length += 1;
                    }
                }
                length = new_length;
                codeword[codeword_length] = digit_32;
                codeword_length          += 1;
            } while (length > 0);

            int[] p = { 0, 0, 0, 0 };
            for (int i = ReedSolomon.base_32_length - 1; i >= 0; i--)
            {
                int fb = codeword[i] ^ p[3];
                p[3] = p[2] ^ ReedSolomon.gmult(30, fb);
                p[2] = p[1] ^ ReedSolomon.gmult(6, fb);
                p[1] = p[0] ^ ReedSolomon.gmult(9, fb);
                p[0] = ReedSolomon.gmult(17, fb);
            }

            Array.Copy(p, 0, codeword, ReedSolomon.base_32_length, ReedSolomon.initial_codeword.Length - ReedSolomon.base_32_length);

            StringBuilder cypher_string_builder = new StringBuilder();

            for (int i = 0; i < 17; i++)
            {
                int codework_index = ReedSolomon.codeword_map[i];
                int alphabet_index = codeword[codework_index];
                cypher_string_builder.Append(ReedSolomon.alphabet[alphabet_index]);

                if ((i & 3) == 3 && i < 13)
                {
                    cypher_string_builder.Append('-');
                }
            }
            return(cypher_string_builder.ToString());
        }