Exemple #1
0
        private static (ReadOnlyMemory <byte>, ReadOnlyMemory <byte>) ExtractVersionInformationBlocks(ReadOnlySpan <byte> symbol)
        {
            byte[] first  = new byte[18];
            byte[] second = new byte[18];

            int sideLength = 4 * QRSymbol.GetVersion(symbol) + 17;

            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    first[i * 3 + j] = symbol[(sideLength - 9 - j) + (5 - i) * sideLength];
                }
            }

            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    second[i * 3 + j] = symbol[(sideLength - 9 - j) * sideLength + (5 - i)];
                }
            }

            return(new ReadOnlyMemory <byte>(first), new ReadOnlyMemory <byte>(second));
        }
        private static (ReadOnlyMemory <byte>, ReadOnlyMemory <byte>) ExtractFormatInformationBlocks(ReadOnlySpan <byte> symbol)
        {
            byte[] first  = new byte[15];
            byte[] second = new byte[15];

            int sideLength = 4 * QRSymbol.GetVersion(symbol) + 17;

            for (int i = 0; i < 6; i++)
            {
                first[i] = symbol[8 * sideLength + i];
            }
            first[6] = symbol[7 + 8 * sideLength];
            first[7] = symbol[8 + 8 * sideLength];
            first[8] = symbol[8 + 7 * sideLength];
            for (int i = 5; i >= 0; i--)
            {
                first[14 - i] = symbol[8 + i * sideLength];
            }

            for (int i = 0; i < 7; i++)
            {
                second[i] = symbol[8 + (sideLength - 1 - i) * sideLength];
            }
            for (int i = 0; i < 8; i++)
            {
                second[14 - i] = symbol[(sideLength - 1 - i) + 8 * sideLength];
            }

            return(new ReadOnlyMemory <byte>(first), new ReadOnlyMemory <byte>(second));
        }
Exemple #3
0
        public static VersionInformation CreateFrom(ReadOnlySpan <byte> symbol)
        {
            int version = QRSymbol.GetVersion(symbol);

            if (version >= 7)
            {
                (var firstVersion, var secondVersion) = DecodeVersionInformationBlocks(ExtractVersionInformationBlocks(symbol));
                if (firstVersion != secondVersion)
                {
                    throw new Exception($"Decoded Version Information is not consistent.{Environment.NewLine}First:{firstVersion}{Environment.NewLine}Second:{secondVersion}");
                }
                else if (firstVersion != version)
                {
                    throw new Exception($"Decoded Version Information does not match with the symbol's size{Environment.NewLine}Decoded:{firstVersion}{Environment.NewLine}Derived from size:{version}");
                }
            }

            return(new VersionInformation(version));
        }