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)); }
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)); }