From 673ee09ef929afdfaed16667c559b891e49355b3 Mon Sep 17 00:00:00 2001 From: kennytm Date: Sun, 5 Jun 2016 00:13:35 +0800 Subject: [PATCH] Fix wrong EC constant of Version-27-Q. Fix issue #7. --- src/ec.rs | 190 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 99 insertions(+), 91 deletions(-) diff --git a/src/ec.rs b/src/ec.rs index 89bc444..bc91d84 100644 --- a/src/ec.rs +++ b/src/ec.rs @@ -325,118 +325,126 @@ static GENERATOR_POLYNOMIALS: [&'static [u8]; 70] = [ /// `EC_BYTES_PER_BLOCK` provides the number of codewords (bytes) used for error /// correction per block in each version. /// -/// This is a copy of ISO/IEC 18004:2006, §6.5.1, Table 9. +/// This is a copy of ISO/IEC 18004:2006, §6.5.1, Table 9 (The 4th column divide +/// by the sum of the 6th column). static EC_BYTES_PER_BLOCK: [[usize; 4]; 44] = [ // Normal versions. - [7, 10, 13, 17], - [10, 16, 22, 28], - [15, 26, 18, 22], - [20, 18, 26, 16], - [26, 24, 18, 22], - [18, 16, 24, 28], - [20, 18, 18, 26], - [24, 22, 22, 26], - [30, 22, 20, 24], - [18, 26, 24, 28], - [20, 30, 28, 24], - [24, 22, 26, 28], - [26, 22, 24, 22], - [30, 24, 20, 24], - [22, 24, 30, 24], - [24, 28, 24, 30], - [28, 28, 28, 28], - [30, 26, 28, 28], - [28, 26, 26, 26], - [28, 26, 30, 28], - [28, 26, 28, 30], - [28, 28, 30, 24], - [30, 28, 30, 30], - [30, 28, 30, 30], - [26, 28, 30, 30], - [28, 28, 28, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], - [30, 28, 30, 30], + [7, 10, 13, 17], // 1 + [10, 16, 22, 28], // 2 + [15, 26, 18, 22], // 3 + [20, 18, 26, 16], // 4 + [26, 24, 18, 22], // 5 + [18, 16, 24, 28], // 6 + [20, 18, 18, 26], // 7 + [24, 22, 22, 26], // 8 + [30, 22, 20, 24], // 9 + [18, 26, 24, 28], // 10 + + [20, 30, 28, 24], // 11 + [24, 22, 26, 28], // 12 + [26, 22, 24, 22], // 13 + [30, 24, 20, 24], // 14 + [22, 24, 30, 24], // 15 + [24, 28, 24, 30], // 16 + [28, 28, 28, 28], // 17 + [30, 26, 28, 28], // 18 + [28, 26, 26, 26], // 19 + [28, 26, 30, 28], // 20 + + [28, 26, 28, 30], // 21 + [28, 28, 30, 24], // 22 + [30, 28, 30, 30], // 23 + [30, 28, 30, 30], // 24 + [26, 28, 30, 30], // 25 + [28, 28, 28, 30], // 26 + [30, 28, 30, 30], // 27 + [30, 28, 30, 30], // 28 + [30, 28, 30, 30], // 29 + [30, 28, 30, 30], // 30 + + [30, 28, 30, 30], // 31 + [30, 28, 30, 30], // 32 + [30, 28, 30, 30], // 33 + [30, 28, 30, 30], // 34 + [30, 28, 30, 30], // 35 + [30, 28, 30, 30], // 36 + [30, 28, 30, 30], // 37 + [30, 28, 30, 30], // 38 + [30, 28, 30, 30], // 39 + [30, 28, 30, 30], // 40 // Micro versions. - [2, 0, 0, 0], - [5, 6, 0, 0], - [6, 8, 0, 0], - [8, 10, 14, 0], + [2, 0, 0, 0], // M1 + [5, 6, 0, 0], // M2 + [6, 8, 0, 0], // M3 + [8, 10, 14, 0], // M4 ]; /// `DATA_BYTES_PER_BLOCK` provides the number of codewords (bytes) used for /// real data per block in each version. /// -/// This is a copy of ISO/IEC 18004:2006, §6.5.1, Table 9. +/// This is a copy of ISO/IEC 18004:2006, §6.5.1, Table 9 (The value "k" of the +/// 7th column, followed by the 6th column). /// /// Every entry is a 4-tuple. Take `DATA_BYTES_PER_BLOCK[39][3] == (15, 20, 16, 61)` /// as an example, this means in version 40 with correction level H, there are /// 20 blocks with 15 bytes in size, and 61 blocks with 16 bytes in size. static DATA_BYTES_PER_BLOCK: [[(usize, usize, usize, usize); 4]; 44] = [ // Normal versions. - [(19, 1, 0, 0), (16, 1, 0, 0), (13, 1, 0, 0), (9, 1, 0, 0)], - [(34, 1, 0, 0), (28, 1, 0, 0), (22, 1, 0, 0), (16, 1, 0, 0)], - [(55, 1, 0, 0), (44, 1, 0, 0), (17, 2, 0, 0), (13, 2, 0, 0)], - [(80, 1, 0, 0), (32, 2, 0, 0), (24, 2, 0, 0), (9, 4, 0, 0)], - [(108, 1, 0, 0), (43, 2, 0, 0), (15, 2, 16, 2), (11, 2, 12, 2)], - [(68, 2, 0, 0), (27, 4, 0, 0), (19, 4, 0, 0), (15, 4, 0, 0)], - [(78, 2, 0, 0), (31, 4, 0, 0), (14, 2, 15, 4), (13, 4, 14, 1)], - [(97, 2, 0, 0), (38, 2, 39, 2), (18, 4, 19, 2), (14, 4, 15, 2)], - [(116, 2, 0, 0), (36, 3, 37, 2), (16, 4, 17, 4), (12, 4, 13, 4)], - [(68, 2, 69, 2), (43, 4, 44, 1), (19, 6, 20, 2), (15, 6, 16, 2)], - [(81, 4, 0, 0), (50, 1, 51, 4), (22, 4, 23, 4), (12, 3, 13, 8)], - [(92, 2, 93, 2), (36, 6, 37, 2), (20, 4, 21, 6), (14, 7, 15, 4)], - [(107, 4, 0, 0), (37, 8, 38, 1), (20, 8, 21, 4), (11, 12, 12, 4)], - [(115, 3, 116, 1), (40, 4, 41, 5), (16, 11, 17, 5), (12, 11, 13, 5)], - [(87, 5, 88, 1), (41, 5, 42, 5), (24, 5, 25, 7), (12, 11, 13, 7)], - [(98, 5, 99, 1), (45, 7, 46, 3), (19, 15, 20, 2), (15, 3, 16, 13)], - [(107, 1, 108, 5), (46, 10, 47, 1), (22, 1, 23, 15), (14, 2, 15, 17)], - [(120, 5, 121, 1), (43, 9, 44, 4), (22, 17, 23, 1), (14, 2, 15, 19)], - [(113, 3, 114, 4), (44, 3, 45, 11), (21, 17, 22, 4), (13, 9, 14, 16)], - [(107, 3, 108, 5), (41, 3, 42, 13), (24, 15, 25, 5), (15, 15, 16, 10)], - [(116, 4, 117, 4), (42, 17, 0, 0), (22, 17, 23, 6), (16, 19, 17, 6)], - [(111, 2, 112, 7), (46, 17, 0, 0), (24, 7, 25, 16), (13, 34, 0, 0)], - [(121, 4, 122, 5), (47, 4, 48, 14), (24, 11, 25, 14), (15, 16, 16, 14)], - [(117, 6, 118, 4), (45, 6, 46, 14), (24, 11, 25, 16), (16, 30, 17, 2)], - [(106, 8, 107, 4), (47, 8, 48, 13), (24, 7, 25, 22), (15, 22, 16, 13)], - [(114, 10, 115, 2), (46, 19, 47, 4), (22, 28, 23, 6), (16, 33, 17, 4)], - [(122, 8, 123, 4), (45, 22, 46, 3), (23, 8, 24, 27), (15, 12, 16, 28)], - [(117, 3, 118, 10), (45, 3, 46, 23), (24, 4, 25, 31), (15, 11, 16, 31)], - [(116, 7, 117, 7), (45, 21, 46, 7), (23, 1, 24, 37), (15, 19, 16, 26)], - [(115, 5, 116, 10), (47, 19, 48, 10), (24, 15, 25, 25), (15, 23, 16, 25)], - [(115, 13, 116, 3), (46, 2, 47, 29), (24, 42, 25, 1), (15, 23, 16, 28)], - [(115, 17, 0, 0), (46, 10, 47, 23), (24, 10, 25, 35), (15, 19, 16, 35)], - [(115, 17, 116, 1), (46, 14, 47, 21), (24, 29, 25, 19), (15, 11, 16, 46)], - [(115, 13, 116, 6), (46, 14, 47, 23), (24, 44, 25, 7), (16, 59, 17, 1)], - [(121, 12, 122, 7), (47, 12, 48, 26), (24, 39, 25, 14), (15, 22, 16, 41)], - [(121, 6, 122, 14), (47, 6, 48, 34), (24, 46, 25, 10), (15, 2, 16, 64)], - [(122, 17, 123, 4), (46, 29, 47, 14), (24, 49, 25, 10), (15, 24, 16, 46)], - [(122, 4, 123, 18), (46, 13, 47, 32), (24, 48, 25, 14), (15, 42, 16, 32)], - [(117, 20, 118, 4), (47, 40, 48, 7), (24, 43, 25, 22), (15, 10, 16, 67)], - [(118, 19, 119, 6), (47, 18, 48, 31), (24, 34, 25, 34), (15, 20, 16, 61)], + [(19, 1, 0, 0), (16, 1, 0, 0), (13, 1, 0, 0), (9, 1, 0, 0)], // 1 + [(34, 1, 0, 0), (28, 1, 0, 0), (22, 1, 0, 0), (16, 1, 0, 0)], // 2 + [(55, 1, 0, 0), (44, 1, 0, 0), (17, 2, 0, 0), (13, 2, 0, 0)], // 3 + [(80, 1, 0, 0), (32, 2, 0, 0), (24, 2, 0, 0), (9, 4, 0, 0)], // 4 + [(108, 1, 0, 0), (43, 2, 0, 0), (15, 2, 16, 2), (11, 2, 12, 2)], // 5 + [(68, 2, 0, 0), (27, 4, 0, 0), (19, 4, 0, 0), (15, 4, 0, 0)], // 6 + [(78, 2, 0, 0), (31, 4, 0, 0), (14, 2, 15, 4), (13, 4, 14, 1)], // 7 + [(97, 2, 0, 0), (38, 2, 39, 2), (18, 4, 19, 2), (14, 4, 15, 2)], // 8 + [(116, 2, 0, 0), (36, 3, 37, 2), (16, 4, 17, 4), (12, 4, 13, 4)], // 9 + [(68, 2, 69, 2), (43, 4, 44, 1), (19, 6, 20, 2), (15, 6, 16, 2)], // 10 + + [(81, 4, 0, 0), (50, 1, 51, 4), (22, 4, 23, 4), (12, 3, 13, 8)], // 11 + [(92, 2, 93, 2), (36, 6, 37, 2), (20, 4, 21, 6), (14, 7, 15, 4)], // 12 + [(107, 4, 0, 0), (37, 8, 38, 1), (20, 8, 21, 4), (11, 12, 12, 4)], // 13 + [(115, 3, 116, 1), (40, 4, 41, 5), (16, 11, 17, 5), (12, 11, 13, 5)], // 14 + [(87, 5, 88, 1), (41, 5, 42, 5), (24, 5, 25, 7), (12, 11, 13, 7)], // 15 + [(98, 5, 99, 1), (45, 7, 46, 3), (19, 15, 20, 2), (15, 3, 16, 13)], // 16 + [(107, 1, 108, 5), (46, 10, 47, 1), (22, 1, 23, 15), (14, 2, 15, 17)], // 17 + [(120, 5, 121, 1), (43, 9, 44, 4), (22, 17, 23, 1), (14, 2, 15, 19)], // 18 + [(113, 3, 114, 4), (44, 3, 45, 11), (21, 17, 22, 4), (13, 9, 14, 16)], // 19 + [(107, 3, 108, 5), (41, 3, 42, 13), (24, 15, 25, 5), (15, 15, 16, 10)], // 20 + + [(116, 4, 117, 4), (42, 17, 0, 0), (22, 17, 23, 6), (16, 19, 17, 6)], // 21 + [(111, 2, 112, 7), (46, 17, 0, 0), (24, 7, 25, 16), (13, 34, 0, 0)], // 22 + [(121, 4, 122, 5), (47, 4, 48, 14), (24, 11, 25, 14), (15, 16, 16, 14)], // 23 + [(117, 6, 118, 4), (45, 6, 46, 14), (24, 11, 25, 16), (16, 30, 17, 2)], // 24 + [(106, 8, 107, 4), (47, 8, 48, 13), (24, 7, 25, 22), (15, 22, 16, 13)], // 25 + [(114, 10, 115, 2), (46, 19, 47, 4), (22, 28, 23, 6), (16, 33, 17, 4)], // 26 + [(122, 8, 123, 4), (45, 22, 46, 3), (23, 8, 24, 26), (15, 12, 16, 28)], // 27 + [(117, 3, 118, 10), (45, 3, 46, 23), (24, 4, 25, 31), (15, 11, 16, 31)], // 28 + [(116, 7, 117, 7), (45, 21, 46, 7), (23, 1, 24, 37), (15, 19, 16, 26)], // 29 + [(115, 5, 116, 10), (47, 19, 48, 10), (24, 15, 25, 25), (15, 23, 16, 25)], // 30 + + [(115, 13, 116, 3), (46, 2, 47, 29), (24, 42, 25, 1), (15, 23, 16, 28)], // 31 + [(115, 17, 0, 0), (46, 10, 47, 23), (24, 10, 25, 35), (15, 19, 16, 35)], // 32 + [(115, 17, 116, 1), (46, 14, 47, 21), (24, 29, 25, 19), (15, 11, 16, 46)], // 33 + [(115, 13, 116, 6), (46, 14, 47, 23), (24, 44, 25, 7), (16, 59, 17, 1)], // 34 + [(121, 12, 122, 7), (47, 12, 48, 26), (24, 39, 25, 14), (15, 22, 16, 41)], // 35 + [(121, 6, 122, 14), (47, 6, 48, 34), (24, 46, 25, 10), (15, 2, 16, 64)], // 36 + [(122, 17, 123, 4), (46, 29, 47, 14), (24, 49, 25, 10), (15, 24, 16, 46)], // 37 + [(122, 4, 123, 18), (46, 13, 47, 32), (24, 48, 25, 14), (15, 42, 16, 32)], // 38 + [(117, 20, 118, 4), (47, 40, 48, 7), (24, 43, 25, 22), (15, 10, 16, 67)], // 39 + [(118, 19, 119, 6), (47, 18, 48, 31), (24, 34, 25, 34), (15, 20, 16, 61)], // 40 // Micro versions. - [(3, 1, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)], - [(5, 1, 0, 0), (4, 1, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)], - [(11, 1, 0, 0), (9, 1, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)], - [(16, 1, 0, 0), (14, 1, 0, 0), (10, 1, 0, 0), (0, 0, 0, 0)], + [(3, 1, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)], // M1 + [(5, 1, 0, 0), (4, 1, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)], // M2 + [(11, 1, 0, 0), (9, 1, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)], // M3 + [(16, 1, 0, 0), (14, 1, 0, 0), (10, 1, 0, 0), (0, 0, 0, 0)], // M4 ]; //}}} -// Copyright 2014 Kenny Chan +// Copyright 2014-2016 kennytm // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of