Skip to main content

qrcode_rust_shared/
qr_rs_block.rs

1//! Reed-Solomon Block - RS block table and lookup
2
3use crate::qr_code_model::QRErrorCorrectLevel;
4
5pub struct QRRSBlock {
6    pub total_count: i32,
7    pub data_count: i32,
8}
9
10impl QRRSBlock {
11    pub fn new(total_count: i32, data_count: i32) -> Self {
12        QRRSBlock {
13            total_count,
14            data_count,
15        }
16    }
17}
18
19// RS 块表: [count, total_count, data_count, count2, total_count2, data_count2]
20const RS_BLOCK_TABLE: &[[i32; 6]] = &[
21    [1, 26, 19, 0, 0, 0],
22    [1, 26, 16, 0, 0, 0],
23    [1, 26, 13, 0, 0, 0],
24    [1, 26, 9, 0, 0, 0],
25    [1, 44, 34, 0, 0, 0],
26    [1, 44, 28, 0, 0, 0],
27    [1, 44, 22, 0, 0, 0],
28    [1, 44, 16, 0, 0, 0],
29    [1, 70, 55, 0, 0, 0],
30    [1, 70, 44, 0, 0, 0],
31    [2, 35, 17, 0, 0, 0],
32    [2, 35, 13, 0, 0, 0],
33    [1, 100, 80, 0, 0, 0],
34    [2, 50, 32, 0, 0, 0],
35    [2, 50, 24, 0, 0, 0],
36    [4, 25, 9, 0, 0, 0],
37    [1, 134, 108, 0, 0, 0],
38    [2, 67, 43, 0, 0, 0],
39    [2, 33, 15, 2, 34, 16],
40    [2, 33, 11, 2, 34, 12],
41    [2, 86, 68, 0, 0, 0],
42    [4, 43, 27, 0, 0, 0],
43    [4, 43, 19, 0, 0, 0],
44    [4, 43, 15, 0, 0, 0],
45    [2, 98, 78, 0, 0, 0],
46    [4, 49, 31, 0, 0, 0],
47    [2, 32, 14, 4, 33, 15],
48    [4, 39, 13, 1, 40, 14],
49    [2, 121, 97, 0, 0, 0],
50    [2, 60, 38, 2, 61, 39],
51    [4, 40, 18, 2, 41, 19],
52    [4, 40, 14, 2, 41, 15],
53    [2, 146, 116, 0, 0, 0],
54    [3, 58, 36, 2, 59, 37],
55    [4, 36, 16, 4, 37, 17],
56    [4, 36, 12, 4, 37, 13],
57    [2, 86, 68, 2, 87, 69],
58    [4, 69, 43, 1, 70, 44],
59    [6, 43, 19, 2, 44, 20],
60    [6, 43, 15, 2, 44, 16],
61    [4, 101, 81, 0, 0, 0],
62    [1, 80, 50, 4, 81, 51],
63    [4, 50, 22, 4, 51, 23],
64    [3, 36, 12, 8, 37, 13],
65    [2, 116, 92, 2, 117, 93],
66    [6, 58, 36, 2, 59, 37],
67    [4, 46, 20, 6, 47, 21],
68    [7, 42, 14, 4, 43, 15],
69    [4, 133, 107, 0, 0, 0],
70    [8, 59, 37, 1, 60, 38],
71    [8, 44, 20, 4, 45, 21],
72    [12, 33, 11, 4, 34, 12],
73    [3, 145, 115, 1, 146, 116],
74    [4, 64, 40, 5, 65, 41],
75    [11, 36, 16, 5, 37, 17],
76    [11, 36, 12, 5, 37, 13],
77    [5, 109, 87, 1, 110, 88],
78    [5, 65, 41, 5, 66, 42],
79    [5, 54, 24, 7, 55, 25],
80    [11, 36, 12, 0, 0, 0],
81    [5, 122, 98, 1, 123, 99],
82    [7, 73, 45, 3, 74, 46],
83    [15, 43, 19, 2, 44, 20],
84    [3, 45, 15, 13, 46, 16],
85    [1, 135, 107, 5, 136, 108],
86    [10, 74, 46, 1, 75, 47],
87    [1, 50, 22, 15, 51, 23],
88    [2, 42, 14, 17, 43, 15],
89    [5, 150, 120, 1, 151, 121],
90    [9, 69, 43, 4, 70, 44],
91    [17, 50, 22, 1, 51, 23],
92    [2, 42, 14, 19, 43, 15],
93    [3, 141, 113, 4, 142, 114],
94    [3, 70, 44, 11, 71, 45],
95    [17, 47, 21, 4, 48, 22],
96    [9, 39, 13, 16, 40, 14],
97    [3, 135, 107, 5, 136, 108],
98    [3, 67, 41, 13, 68, 42],
99    [15, 54, 24, 5, 55, 25],
100    [15, 43, 15, 10, 44, 16],
101    [4, 144, 116, 4, 145, 117],
102    [17, 68, 42, 0, 0, 0],
103    [17, 50, 22, 6, 51, 23],
104    [19, 46, 16, 6, 47, 17],
105    [2, 139, 111, 7, 140, 112],
106    [17, 74, 46, 0, 0, 0],
107    [7, 54, 24, 16, 55, 25],
108    [34, 37, 13, 0, 0, 0],
109    [4, 151, 121, 5, 152, 122],
110    [4, 75, 47, 14, 76, 48],
111    [11, 54, 24, 14, 55, 25],
112    [16, 45, 15, 14, 46, 16],
113    [6, 147, 117, 4, 148, 118],
114    [6, 73, 45, 14, 74, 46],
115    [11, 54, 24, 16, 55, 25],
116    [30, 46, 16, 2, 47, 17],
117    [8, 132, 106, 4, 133, 107],
118    [8, 75, 47, 13, 76, 48],
119    [7, 54, 24, 22, 55, 25],
120    [22, 45, 15, 13, 46, 16],
121    [10, 142, 114, 2, 143, 115],
122    [19, 74, 46, 4, 75, 47],
123    [28, 50, 22, 6, 51, 23],
124    [33, 46, 16, 4, 47, 17],
125    [8, 152, 122, 4, 153, 123],
126    [22, 73, 45, 3, 74, 46],
127    [8, 53, 23, 26, 54, 24],
128    [12, 45, 15, 28, 46, 16],
129    [3, 147, 117, 10, 148, 118],
130    [3, 73, 45, 23, 74, 46],
131    [4, 54, 24, 31, 55, 25],
132    [11, 45, 15, 31, 46, 16],
133    [7, 146, 116, 7, 147, 117],
134    [21, 73, 45, 7, 74, 46],
135    [1, 53, 23, 37, 54, 24],
136    [19, 45, 15, 26, 46, 16],
137    [5, 145, 115, 10, 146, 116],
138    [19, 75, 47, 10, 76, 48],
139    [15, 54, 24, 25, 55, 25],
140    [23, 45, 15, 25, 46, 16],
141    [13, 145, 115, 3, 146, 116],
142    [2, 74, 46, 29, 75, 47],
143    [42, 54, 24, 1, 55, 25],
144    [23, 45, 15, 28, 46, 16],
145    [17, 145, 115, 0, 0, 0],
146    [10, 74, 46, 23, 75, 47],
147    [10, 54, 24, 35, 55, 25],
148    [19, 45, 15, 35, 46, 16],
149    [17, 145, 115, 1, 146, 116],
150    [14, 74, 46, 21, 75, 47],
151    [29, 54, 24, 19, 55, 25],
152    [11, 45, 15, 46, 46, 16],
153    [13, 145, 115, 6, 146, 116],
154    [14, 74, 46, 23, 75, 47],
155    [44, 54, 24, 7, 55, 25],
156    [59, 46, 16, 1, 47, 17],
157    [12, 151, 121, 7, 152, 122],
158    [12, 75, 47, 26, 76, 48],
159    [39, 54, 24, 14, 55, 25],
160    [22, 45, 15, 41, 46, 16],
161    [6, 151, 121, 14, 152, 122],
162    [6, 75, 47, 34, 76, 48],
163    [46, 54, 24, 10, 55, 25],
164    [2, 45, 15, 64, 46, 16],
165    [17, 152, 122, 4, 153, 123],
166    [29, 74, 46, 14, 75, 47],
167    [49, 54, 24, 10, 55, 25],
168    [24, 45, 15, 46, 46, 16],
169    [4, 152, 122, 18, 153, 123],
170    [13, 74, 46, 32, 75, 47],
171    [48, 54, 24, 14, 55, 25],
172    [42, 45, 15, 32, 46, 16],
173    [20, 147, 117, 4, 148, 118],
174    [40, 75, 47, 7, 76, 48],
175    [43, 54, 24, 22, 55, 25],
176    [10, 45, 15, 67, 46, 16],
177    [19, 148, 118, 6, 149, 119],
178    [18, 75, 47, 31, 76, 48],
179    [34, 54, 24, 34, 55, 25],
180    [20, 45, 15, 61, 46, 16],
181];
182
183pub fn get_rs_blocks(type_number: i32, error_correct_level: QRErrorCorrectLevel) -> Vec<QRRSBlock> {
184    let level_map = [1, 0, 3, 2];
185    let level_index = level_map[error_correct_level as usize];
186    let index = ((type_number - 1) * 4 + level_index) as usize;
187
188    let rs_block = RS_BLOCK_TABLE.get(index).unwrap_or(&RS_BLOCK_TABLE[0]);
189    let mut list = Vec::new();
190
191    let length = rs_block.len() / 3;
192    for i in 0..length {
193        let count = rs_block[i * 3];
194        let total_count = rs_block[i * 3 + 1];
195        let data_count = rs_block[i * 3 + 2];
196
197        for _ in 0..count {
198            list.push(QRRSBlock::new(total_count, data_count));
199        }
200    }
201
202    list
203}
204
205#[cfg(test)]
206mod tests {
207    use super::*;
208
209    #[test]
210    fn test_get_rs_blocks_v1() {
211        let blocks = get_rs_blocks(1, QRErrorCorrectLevel::H);
212        assert!(!blocks.is_empty());
213    }
214
215    #[test]
216    fn test_get_rs_blocks_all_levels() {
217        for level in [
218            QRErrorCorrectLevel::L,
219            QRErrorCorrectLevel::M,
220            QRErrorCorrectLevel::Q,
221            QRErrorCorrectLevel::H,
222        ] {
223            let blocks = get_rs_blocks(2, level);
224            assert!(
225                !blocks.is_empty(),
226                "Version 2 {:?} should have blocks",
227                level
228            );
229        }
230    }
231}