diff --git a/cli/src/main.rs b/cli/src/main.rs index 74d8411..638c8f1 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -61,8 +61,8 @@ fn main() -> anyhow::Result<()> { margin: args.margin, }; - let qr = QrCode::encode(&args.content, config) - .map_err(|e| anyhow::anyhow!("编码失败: {}", e))?; + let qr = + QrCode::encode(&args.content, config).map_err(|e| anyhow::anyhow!("编码失败: {}", e))?; match args.output { Some(path) => { @@ -76,14 +76,19 @@ fn main() -> anyhow::Result<()> { "png" => { let bytes = qr.to_png_bytes(args.size); std::fs::write(&path, bytes)?; - println!("已生成: {} (版本 {}, {}×{} 模块, {} 级纠错)", - path, qr.version.0, qr.size(), qr.size(), + println!( + "已生成: {} (版本 {}, {}×{} 模块, {} 级纠错)", + path, + qr.version.0, + qr.size(), + qr.size(), match qr.level { EcLevel::L => "L", EcLevel::M => "M", EcLevel::Q => "Q", EcLevel::H => "H", - }); + } + ); } "svg" => { let svg = qr.to_svg(); diff --git a/core/src/ecc/galois.rs b/core/src/ecc/galois.rs index de2f658..439e9ba 100644 --- a/core/src/ecc/galois.rs +++ b/core/src/ecc/galois.rs @@ -111,8 +111,7 @@ mod tests { fn test_mul_commutative() { for a in 0..=255u8 { for b in (a..=255u8).step_by(17) { - assert_eq!(mul(a, b), mul(b, a), - "交换律失败: {:02X} * {:02X}", a, b); + assert_eq!(mul(a, b), mul(b, a), "交换律失败: {:02X} * {:02X}", a, b); } } } @@ -121,8 +120,14 @@ mod tests { fn test_mul_associative() { let cases = [(3, 5, 7), (0xFF, 2, 4), (1, 1, 1), (0x80, 0x40, 0x20)]; for (a, b, c) in cases { - assert_eq!(mul(mul(a, b), c), mul(a, mul(b, c)), - "结合律失败: {:02X} * {:02X} * {:02X}", a, b, c); + assert_eq!( + mul(mul(a, b), c), + mul(a, mul(b, c)), + "结合律失败: {:02X} * {:02X} * {:02X}", + a, + b, + c + ); } } @@ -130,8 +135,7 @@ mod tests { fn test_div_inverse() { for a in 1..=255u8 { let inv = div(1, a); - assert_eq!(mul(a, inv), 1, - "逆元失败: {:02X} * {:02X} != 1", a, inv); + assert_eq!(mul(a, inv), 1, "逆元失败: {:02X} * {:02X} != 1", a, inv); } } @@ -140,8 +144,14 @@ mod tests { for a in 1..=255u8 { for b in (1..=255u8).step_by(17) { let q = div(a, b); - assert_eq!(mul(q, b), a, - "除乘一致性失败: {:02X} / {:02X} = {:02X}", a, q, b); + assert_eq!( + mul(q, b), + a, + "除乘一致性失败: {:02X} / {:02X} = {:02X}", + a, + q, + b + ); } } } diff --git a/core/src/ecc/reed_solomon.rs b/core/src/ecc/reed_solomon.rs index 0d6c4a2..610b111 100644 --- a/core/src/ecc/reed_solomon.rs +++ b/core/src/ecc/reed_solomon.rs @@ -64,10 +64,7 @@ pub fn interleave(blocks: &[Vec], ec_count: u8) -> Vec { } // 对每个块计算 EC - let ec_blocks: Vec> = blocks - .iter() - .map(|b| compute_ec(b, ec_count)) - .collect(); + let ec_blocks: Vec> = blocks.iter().map(|b| compute_ec(b, ec_count)).collect(); // EC 码字交错 for i in 0..ec_count as usize { diff --git a/core/src/encoder/bitstream.rs b/core/src/encoder/bitstream.rs index 396bae2..4270796 100644 --- a/core/src/encoder/bitstream.rs +++ b/core/src/encoder/bitstream.rs @@ -1,6 +1,4 @@ -use crate::encoder::mode::{ - encode_alphanumeric, encode_byte, encode_kanji, encode_numeric, Mode, -}; +use crate::encoder::mode::{encode_alphanumeric, encode_byte, encode_kanji, encode_numeric, Mode}; use crate::encoder::segment::segment_text; use crate::version::{get_data_capacity, EcLevel, Version}; diff --git a/core/src/encoder/mod.rs b/core/src/encoder/mod.rs index 4fc8e37..4a64786 100644 --- a/core/src/encoder/mod.rs +++ b/core/src/encoder/mod.rs @@ -1,3 +1,3 @@ +pub mod bitstream; pub mod mode; pub mod segment; -pub mod bitstream; diff --git a/core/src/encoder/mode.rs b/core/src/encoder/mode.rs index 71ff86d..5ae63c0 100644 --- a/core/src/encoder/mode.rs +++ b/core/src/encoder/mode.rs @@ -22,16 +22,38 @@ impl Mode { pub fn count_bits(self, version: u8) -> u8 { match self { Mode::Numeric => { - if version <= 9 { 10 } else if version <= 26 { 12 } else { 14 } + if version <= 9 { + 10 + } else if version <= 26 { + 12 + } else { + 14 + } } Mode::Alphanumeric => { - if version <= 9 { 9 } else if version <= 26 { 11 } else { 13 } + if version <= 9 { + 9 + } else if version <= 26 { + 11 + } else { + 13 + } } Mode::Byte => { - if version <= 9 { 8 } else { 16 } + if version <= 9 { + 8 + } else { + 16 + } } Mode::Kanji => { - if version <= 9 { 8 } else if version <= 26 { 10 } else { 12 } + if version <= 9 { + 8 + } else if version <= 26 { + 10 + } else { + 12 + } } } } @@ -40,7 +62,8 @@ impl Mode { /// 数字模式编码: 每 3 位数字 → 10 bit pub fn encode_numeric(input: &str) -> Vec { let mut bits = Vec::new(); - let chars: Vec = input.chars() + let chars: Vec = input + .chars() .filter_map(|c| c.to_digit(10).map(|d| d as u8)) .collect(); @@ -65,9 +88,11 @@ const ALPHANUMERIC_CHARS: &[u8] = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./ /// 字母数字模式编码: 每 2 个字符 → 11 bit pub fn encode_alphanumeric(input: &str) -> Vec { - let values: Vec = input.chars() + let values: Vec = input + .chars() .filter_map(|c| { - ALPHANUMERIC_CHARS.iter() + ALPHANUMERIC_CHARS + .iter() .position(|&x| x == c as u8) .map(|i| i as u8) }) diff --git a/core/src/lib.rs b/core/src/lib.rs index c4b586e..293cc11 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -1,6 +1,6 @@ pub mod ecc; pub mod encoder; pub mod matrix; +pub mod qr; pub mod render; pub mod version; -pub mod qr; diff --git a/core/src/matrix/grid.rs b/core/src/matrix/grid.rs index 838e56e..8622b96 100644 --- a/core/src/matrix/grid.rs +++ b/core/src/matrix/grid.rs @@ -2,15 +2,19 @@ #[derive(Clone)] pub struct Matrix { pub size: u8, - pub modules: Vec>, // true = 暗(黑), false = 亮(白) - pub reserved: Vec>, // true = 功能图案占用,不可放数据 + pub modules: Vec>, // true = 暗(黑), false = 亮(白) + pub reserved: Vec>, // true = 功能图案占用,不可放数据 } impl Matrix { pub fn new(size: u8) -> Self { let modules = vec![vec![false; size as usize]; size as usize]; let reserved = vec![vec![false; size as usize]; size as usize]; - Matrix { size, modules, reserved } + Matrix { + size, + modules, + reserved, + } } pub fn get(&self, x: u8, y: u8) -> bool { diff --git a/core/src/matrix/mask.rs b/core/src/matrix/mask.rs index e8c6421..547bfd2 100644 --- a/core/src/matrix/mask.rs +++ b/core/src/matrix/mask.rs @@ -209,7 +209,7 @@ mod tests { let m = Matrix::new(21); // 不设置 reserved,所有区域都是数据区 let masked = apply_mask(&m, 0); // (x+y) % 2 == 0 - // 初始全白,掩码 0 会在 (x+y)%2==0 的位置翻转 + // 初始全白,掩码 0 会在 (x+y)%2==0 的位置翻转 assert_eq!(masked.get(0, 0), true); // (0+0)%2=0 → 翻转 assert_eq!(masked.get(1, 0), false); // (1+0)%2=1 → 不变 } diff --git a/core/src/matrix/mod.rs b/core/src/matrix/mod.rs index 3ab7f3e..c75eaaa 100644 --- a/core/src/matrix/mod.rs +++ b/core/src/matrix/mod.rs @@ -1,4 +1,4 @@ pub mod grid; +pub mod mask; pub mod patterns; pub mod placement; -pub mod mask; diff --git a/core/src/matrix/patterns.rs b/core/src/matrix/patterns.rs index fa8a0ed..c50f4ef 100644 --- a/core/src/matrix/patterns.rs +++ b/core/src/matrix/patterns.rs @@ -3,9 +3,9 @@ use crate::matrix::grid::Matrix; /// 放置定位图案(3 个角上的大回字形,7×7) pub fn place_finder_patterns(matrix: &mut Matrix) { let positions = [ - (0u8, 0u8), // 左上 - (matrix.size - 7, 0), // 右上 - (0, matrix.size - 7), // 左下 + (0u8, 0u8), // 左上 + (matrix.size - 7, 0), // 右上 + (0, matrix.size - 7), // 左下 ]; for &(fx, fy) in &positions { @@ -78,11 +78,17 @@ fn is_near_finder(x: u8, y: u8, size: u8) -> bool { let x = x as i16; let y = y as i16; // 左上角 - if x - 2 < 7 && y - 2 < 7 { return true; } + if x - 2 < 7 && y - 2 < 7 { + return true; + } // 右上角 - if x + 2 >= s - 7 && y - 2 < 7 { return true; } + if x + 2 >= s - 7 && y - 2 < 7 { + return true; + } // 左下角 - if x - 2 < 7 && y + 2 >= s - 7 { return true; } + if x - 2 < 7 && y + 2 >= s - 7 { + return true; + } false } @@ -92,13 +98,21 @@ pub fn reserve_format_areas(matrix: &mut Matrix) { // 定位图案旁的格式信息条 for i in 0..9u8 { // 左上水平 - if i != 6 { matrix.reserve(i, 8); } + if i != 6 { + matrix.reserve(i, 8); + } // 左上垂直 - if i != 6 { matrix.reserve(8, i); } + if i != 6 { + matrix.reserve(8, i); + } // 右上垂直 - if i + size - 8 < size { matrix.reserve(size - 1 - i, 8); } + if i + size - 8 < size { + matrix.reserve(size - 1 - i, 8); + } // 左下水平 - if i + size - 8 < size { matrix.reserve(8, size - 1 - i); } + if i + size - 8 < size { + matrix.reserve(8, size - 1 - i); + } } // 暗模块位置 if size > 8 { @@ -144,16 +158,40 @@ pub fn place_format_info(matrix: &mut Matrix, format: u16) { // 第一组:左上角定位图案旁 let coords1: [(u8, u8); 15] = [ - (0, 8), (1, 8), (2, 8), (3, 8), (4, 8), (5, 8), (7, 8), (8, 8), - (8, 7), (8, 5), (8, 4), (8, 3), (8, 2), (8, 1), (8, 0), + (0, 8), + (1, 8), + (2, 8), + (3, 8), + (4, 8), + (5, 8), + (7, 8), + (8, 8), + (8, 7), + (8, 5), + (8, 4), + (8, 3), + (8, 2), + (8, 1), + (8, 0), ]; // 第二组:右下角,拆分为右上角旁 + 左下角旁 let coords2: [(u8, u8); 15] = [ - (size - 1, 8), (size - 2, 8), (size - 3, 8), (size - 4, 8), - (size - 5, 8), (size - 6, 8), (size - 7, 8), (size - 8, 8), - (8, size - 7), (8, size - 6), (8, size - 5), (8, size - 4), - (8, size - 3), (8, size - 2), (8, size - 1), + (size - 1, 8), + (size - 2, 8), + (size - 3, 8), + (size - 4, 8), + (size - 5, 8), + (size - 6, 8), + (size - 7, 8), + (size - 8, 8), + (8, size - 7), + (8, size - 6), + (8, size - 5), + (8, size - 4), + (8, size - 3), + (8, size - 2), + (8, size - 1), ]; for i in 0..15 { @@ -220,8 +258,8 @@ mod tests { fn test_timing_patterns_alternate() { let mut m = Matrix::new(21); place_timing_patterns(&mut m); - assert!(m.get(8, 6)); // 偶数 = 暗 - assert!(!m.get(9, 6)); // 奇数 = 亮 + assert!(m.get(8, 6)); // 偶数 = 暗 + assert!(!m.get(9, 6)); // 奇数 = 亮 } #[test] diff --git a/core/src/qr.rs b/core/src/qr.rs index 26ea9c6..bc9b257 100644 --- a/core/src/qr.rs +++ b/core/src/qr.rs @@ -1,15 +1,15 @@ -use crate::version::{Version, EcLevel, get_data_capacity}; -use crate::encoder::bitstream::build_codewords; -use crate::encoder::segment::{segment_text, segment_bit_length}; use crate::ecc::reed_solomon; +use crate::encoder::bitstream::build_codewords; +use crate::encoder::segment::{segment_bit_length, segment_text}; use crate::matrix::grid::Matrix; +use crate::matrix::mask::best_mask; use crate::matrix::patterns::{ - place_finder_patterns, place_timing_patterns, place_alignment_patterns, - reserve_format_areas, reserve_version_areas, - encode_format_info, encode_version_info, place_format_info, place_version_info, + encode_format_info, encode_version_info, place_alignment_patterns, place_finder_patterns, + place_format_info, place_timing_patterns, place_version_info, reserve_format_areas, + reserve_version_areas, }; use crate::matrix::placement::place_data; -use crate::matrix::mask::best_mask; +use crate::version::{get_data_capacity, EcLevel, Version}; /// 版本选择模式 #[derive(Debug, Clone)] @@ -61,10 +61,7 @@ impl QrCode { let mut selected = None; for v in 1..=40 { let ver = Version(v); - let total_bits: u16 = segments - .iter() - .map(|s| segment_bit_length(s, v)) - .sum(); + let total_bits: u16 = segments.iter().map(|s| segment_bit_length(s, v)).sum(); let cap = get_data_capacity(ver, config.level) as u32 * 8; if cap >= total_bits as u32 { selected = Some(ver); diff --git a/core/src/render/mod.rs b/core/src/render/mod.rs index 02b672d..63b6daf 100644 --- a/core/src/render/mod.rs +++ b/core/src/render/mod.rs @@ -1,3 +1,3 @@ +pub mod ascii; pub mod png; pub mod svg; -pub mod ascii; diff --git a/core/src/render/png.rs b/core/src/render/png.rs index 65c1ae7..3da61b3 100644 --- a/core/src/render/png.rs +++ b/core/src/render/png.rs @@ -34,10 +34,7 @@ pub fn render_png(qr: &QrCode, module_size: u8) -> Vec { } let mut buf = Vec::new(); - img.write_to( - &mut std::io::Cursor::new(&mut buf), - image::ImageFormat::Png, - ) - .expect("PNG 编码失败"); + img.write_to(&mut std::io::Cursor::new(&mut buf), image::ImageFormat::Png) + .expect("PNG 编码失败"); buf } diff --git a/core/src/version.rs b/core/src/version.rs index 70c928c..b08f9e4 100644 --- a/core/src/version.rs +++ b/core/src/version.rs @@ -27,7 +27,11 @@ pub struct Version(pub u8); impl Version { pub fn new(v: u8) -> Option { - if (1..=40).contains(&v) { Some(Version(v)) } else { None } + if (1..=40).contains(&v) { + Some(Version(v)) + } else { + None + } } /// QR 码边长(模块数) @@ -44,17 +48,51 @@ impl Version { pub fn ec_info(self, level: EcLevel) -> EcInfo { let row = &VERSION_TABLE[self.0 as usize - 1]; let (total, ec_per_block, g1_blocks, g1_data, g2_blocks, g2_data) = match level { - EcLevel::L => (row.l_total, row.l_ec, row.l_g1, row.l_g1_data, row.l_g2, row.l_g2_data), - EcLevel::M => (row.m_total, row.m_ec, row.m_g1, row.m_g1_data, row.m_g2, row.m_g2_data), - EcLevel::Q => (row.q_total, row.q_ec, row.q_g1, row.q_g1_data, row.q_g2, row.q_g2_data), - EcLevel::H => (row.h_total, row.h_ec, row.h_g1, row.h_g1_data, row.h_g2, row.h_g2_data), + EcLevel::L => ( + row.l_total, + row.l_ec, + row.l_g1, + row.l_g1_data, + row.l_g2, + row.l_g2_data, + ), + EcLevel::M => ( + row.m_total, + row.m_ec, + row.m_g1, + row.m_g1_data, + row.m_g2, + row.m_g2_data, + ), + EcLevel::Q => ( + row.q_total, + row.q_ec, + row.q_g1, + row.q_g1_data, + row.q_g2, + row.q_g2_data, + ), + EcLevel::H => ( + row.h_total, + row.h_ec, + row.h_g1, + row.h_g1_data, + row.h_g2, + row.h_g2_data, + ), }; EcInfo { total_codewords: total, ec_per_block, blocks: vec![ - BlockInfo { count: g1_blocks, data_codewords: g1_data }, - BlockInfo { count: g2_blocks, data_codewords: g2_data }, + BlockInfo { + count: g1_blocks, + data_codewords: g1_data, + }, + BlockInfo { + count: g2_blocks, + data_codewords: g2_data, + }, ], } } @@ -73,10 +111,30 @@ pub struct BlockInfo { /// 单行版本数据 struct VersionRow { - l_total: u16, l_ec: u8, l_g1: u16, l_g1_data: u16, l_g2: u16, l_g2_data: u16, - m_total: u16, m_ec: u8, m_g1: u16, m_g1_data: u16, m_g2: u16, m_g2_data: u16, - q_total: u16, q_ec: u8, q_g1: u16, q_g1_data: u16, q_g2: u16, q_g2_data: u16, - h_total: u16, h_ec: u8, h_g1: u16, h_g1_data: u16, h_g2: u16, h_g2_data: u16, + l_total: u16, + l_ec: u8, + l_g1: u16, + l_g1_data: u16, + l_g2: u16, + l_g2_data: u16, + m_total: u16, + m_ec: u8, + m_g1: u16, + m_g1_data: u16, + m_g2: u16, + m_g2_data: u16, + q_total: u16, + q_ec: u8, + q_g1: u16, + q_g1_data: u16, + q_g2: u16, + q_g2_data: u16, + h_total: u16, + h_ec: u8, + h_g1: u16, + h_g1_data: u16, + h_g2: u16, + h_g2_data: u16, } /// ISO 18004 附录 I — 40 版本 × 4 纠错级别的容量表 @@ -84,129 +142,1129 @@ struct VersionRow { /// 当 g2_data == 0 时,表示仅有一组 static VERSION_TABLE: [VersionRow; 40] = [ // 版本 1 - VersionRow { l_total:26, l_ec:7, l_g1:1, l_g1_data:19, l_g2:0, l_g2_data:0, m_total:26, m_ec:10, m_g1:1, m_g1_data:16, m_g2:0, m_g2_data:0, q_total:26, q_ec:13, q_g1:1, q_g1_data:13, q_g2:0, q_g2_data:0, h_total:26, h_ec:17, h_g1:1, h_g1_data:9, h_g2:0, h_g2_data:0 }, + VersionRow { + l_total: 26, + l_ec: 7, + l_g1: 1, + l_g1_data: 19, + l_g2: 0, + l_g2_data: 0, + m_total: 26, + m_ec: 10, + m_g1: 1, + m_g1_data: 16, + m_g2: 0, + m_g2_data: 0, + q_total: 26, + q_ec: 13, + q_g1: 1, + q_g1_data: 13, + q_g2: 0, + q_g2_data: 0, + h_total: 26, + h_ec: 17, + h_g1: 1, + h_g1_data: 9, + h_g2: 0, + h_g2_data: 0, + }, // 版本 2 - VersionRow { l_total:44, l_ec:10, l_g1:1, l_g1_data:34, l_g2:0, l_g2_data:0, m_total:44, m_ec:16, m_g1:1, m_g1_data:28, m_g2:0, m_g2_data:0, q_total:44, q_ec:22, q_g1:1, q_g1_data:22, q_g2:0, q_g2_data:0, h_total:44, h_ec:28, h_g1:1, h_g1_data:16, h_g2:0, h_g2_data:0 }, + VersionRow { + l_total: 44, + l_ec: 10, + l_g1: 1, + l_g1_data: 34, + l_g2: 0, + l_g2_data: 0, + m_total: 44, + m_ec: 16, + m_g1: 1, + m_g1_data: 28, + m_g2: 0, + m_g2_data: 0, + q_total: 44, + q_ec: 22, + q_g1: 1, + q_g1_data: 22, + q_g2: 0, + q_g2_data: 0, + h_total: 44, + h_ec: 28, + h_g1: 1, + h_g1_data: 16, + h_g2: 0, + h_g2_data: 0, + }, // 版本 3 - VersionRow { l_total:70, l_ec:15, l_g1:1, l_g1_data:55, l_g2:0, l_g2_data:0, m_total:70, m_ec:26, m_g1:1, m_g1_data:44, m_g2:0, m_g2_data:0, q_total:70, q_ec:18, q_g1:2, q_g1_data:17, q_g2:0, q_g2_data:0, h_total:70, h_ec:22, h_g1:2, h_g1_data:13, h_g2:0, h_g2_data:0 }, + VersionRow { + l_total: 70, + l_ec: 15, + l_g1: 1, + l_g1_data: 55, + l_g2: 0, + l_g2_data: 0, + m_total: 70, + m_ec: 26, + m_g1: 1, + m_g1_data: 44, + m_g2: 0, + m_g2_data: 0, + q_total: 70, + q_ec: 18, + q_g1: 2, + q_g1_data: 17, + q_g2: 0, + q_g2_data: 0, + h_total: 70, + h_ec: 22, + h_g1: 2, + h_g1_data: 13, + h_g2: 0, + h_g2_data: 0, + }, // 版本 4 - VersionRow { l_total:100, l_ec:20, l_g1:1, l_g1_data:80, l_g2:0, l_g2_data:0, m_total:100, m_ec:18, m_g1:2, m_g1_data:32, m_g2:0, m_g2_data:0, q_total:100, q_ec:26, q_g1:2, q_g1_data:24, q_g2:0, q_g2_data:0, h_total:100, h_ec:16, h_g1:4, h_g1_data:9, h_g2:0, h_g2_data:0 }, + VersionRow { + l_total: 100, + l_ec: 20, + l_g1: 1, + l_g1_data: 80, + l_g2: 0, + l_g2_data: 0, + m_total: 100, + m_ec: 18, + m_g1: 2, + m_g1_data: 32, + m_g2: 0, + m_g2_data: 0, + q_total: 100, + q_ec: 26, + q_g1: 2, + q_g1_data: 24, + q_g2: 0, + q_g2_data: 0, + h_total: 100, + h_ec: 16, + h_g1: 4, + h_g1_data: 9, + h_g2: 0, + h_g2_data: 0, + }, // 版本 5 - VersionRow { l_total:134, l_ec:26, l_g1:1, l_g1_data:108, l_g2:0, l_g2_data:0, m_total:134, m_ec:24, m_g1:2, m_g1_data:43, m_g2:0, m_g2_data:0, q_total:134, q_ec:18, q_g1:2, q_g1_data:15, q_g2:2, q_g2_data:16, h_total:134, h_ec:22, h_g1:4, h_g1_data:11, h_g2:2, h_g2_data:12 }, + VersionRow { + l_total: 134, + l_ec: 26, + l_g1: 1, + l_g1_data: 108, + l_g2: 0, + l_g2_data: 0, + m_total: 134, + m_ec: 24, + m_g1: 2, + m_g1_data: 43, + m_g2: 0, + m_g2_data: 0, + q_total: 134, + q_ec: 18, + q_g1: 2, + q_g1_data: 15, + q_g2: 2, + q_g2_data: 16, + h_total: 134, + h_ec: 22, + h_g1: 4, + h_g1_data: 11, + h_g2: 2, + h_g2_data: 12, + }, // 版本 6 - VersionRow { l_total:172, l_ec:18, l_g1:2, l_g1_data:68, l_g2:0, l_g2_data:0, m_total:172, m_ec:16, m_g1:4, m_g1_data:27, m_g2:0, m_g2_data:0, q_total:172, q_ec:24, q_g1:4, q_g1_data:19, q_g2:0, q_g2_data:0, h_total:172, h_ec:28, h_g1:4, h_g1_data:15, h_g2:0, h_g2_data:0 }, + VersionRow { + l_total: 172, + l_ec: 18, + l_g1: 2, + l_g1_data: 68, + l_g2: 0, + l_g2_data: 0, + m_total: 172, + m_ec: 16, + m_g1: 4, + m_g1_data: 27, + m_g2: 0, + m_g2_data: 0, + q_total: 172, + q_ec: 24, + q_g1: 4, + q_g1_data: 19, + q_g2: 0, + q_g2_data: 0, + h_total: 172, + h_ec: 28, + h_g1: 4, + h_g1_data: 15, + h_g2: 0, + h_g2_data: 0, + }, // 版本 7 - VersionRow { l_total:196, l_ec:20, l_g1:2, l_g1_data:78, l_g2:0, l_g2_data:0, m_total:196, m_ec:18, m_g1:4, m_g1_data:31, m_g2:0, m_g2_data:0, q_total:196, q_ec:18, q_g1:2, q_g1_data:14, q_g2:4, q_g2_data:15, h_total:196, h_ec:26, h_g1:4, h_g1_data:13, h_g2:1, h_g2_data:14 }, + VersionRow { + l_total: 196, + l_ec: 20, + l_g1: 2, + l_g1_data: 78, + l_g2: 0, + l_g2_data: 0, + m_total: 196, + m_ec: 18, + m_g1: 4, + m_g1_data: 31, + m_g2: 0, + m_g2_data: 0, + q_total: 196, + q_ec: 18, + q_g1: 2, + q_g1_data: 14, + q_g2: 4, + q_g2_data: 15, + h_total: 196, + h_ec: 26, + h_g1: 4, + h_g1_data: 13, + h_g2: 1, + h_g2_data: 14, + }, // 版本 8 - VersionRow { l_total:242, l_ec:24, l_g1:2, l_g1_data:97, l_g2:0, l_g2_data:0, m_total:242, m_ec:22, m_g1:2, m_g1_data:38, m_g2:2, m_g2_data:39, q_total:242, q_ec:22, q_g1:4, q_g1_data:18, q_g2:2, q_g2_data:19, h_total:242, h_ec:26, h_g1:4, h_g1_data:14, h_g2:2, h_g2_data:15 }, + VersionRow { + l_total: 242, + l_ec: 24, + l_g1: 2, + l_g1_data: 97, + l_g2: 0, + l_g2_data: 0, + m_total: 242, + m_ec: 22, + m_g1: 2, + m_g1_data: 38, + m_g2: 2, + m_g2_data: 39, + q_total: 242, + q_ec: 22, + q_g1: 4, + q_g1_data: 18, + q_g2: 2, + q_g2_data: 19, + h_total: 242, + h_ec: 26, + h_g1: 4, + h_g1_data: 14, + h_g2: 2, + h_g2_data: 15, + }, // 版本 9 - VersionRow { l_total:292, l_ec:30, l_g1:2, l_g1_data:116, l_g2:0, l_g2_data:0, m_total:292, m_ec:22, m_g1:3, m_g1_data:36, m_g2:2, m_g2_data:37, q_total:292, q_ec:20, q_g1:4, q_g1_data:16, q_g2:4, q_g2_data:17, h_total:292, h_ec:24, h_g1:4, h_g1_data:12, h_g2:4, h_g2_data:13 }, + VersionRow { + l_total: 292, + l_ec: 30, + l_g1: 2, + l_g1_data: 116, + l_g2: 0, + l_g2_data: 0, + m_total: 292, + m_ec: 22, + m_g1: 3, + m_g1_data: 36, + m_g2: 2, + m_g2_data: 37, + q_total: 292, + q_ec: 20, + q_g1: 4, + q_g1_data: 16, + q_g2: 4, + q_g2_data: 17, + h_total: 292, + h_ec: 24, + h_g1: 4, + h_g1_data: 12, + h_g2: 4, + h_g2_data: 13, + }, // 版本 10 - VersionRow { l_total:346, l_ec:18, l_g1:2, l_g1_data:68, l_g2:2, l_g2_data:69, m_total:346, m_ec:26, m_g1:4, m_g1_data:43, m_g2:1, m_g2_data:44, q_total:346, q_ec:24, q_g1:6, q_g1_data:19, q_g2:2, q_g2_data:20, h_total:346, h_ec:28, h_g1:6, h_g1_data:15, h_g2:2, h_g2_data:16 }, + VersionRow { + l_total: 346, + l_ec: 18, + l_g1: 2, + l_g1_data: 68, + l_g2: 2, + l_g2_data: 69, + m_total: 346, + m_ec: 26, + m_g1: 4, + m_g1_data: 43, + m_g2: 1, + m_g2_data: 44, + q_total: 346, + q_ec: 24, + q_g1: 6, + q_g1_data: 19, + q_g2: 2, + q_g2_data: 20, + h_total: 346, + h_ec: 28, + h_g1: 6, + h_g1_data: 15, + h_g2: 2, + h_g2_data: 16, + }, // 版本 11 - VersionRow { l_total:404, l_ec:20, l_g1:4, l_g1_data:81, l_g2:0, l_g2_data:0, m_total:404, m_ec:30, m_g1:1, m_g1_data:50, m_g2:4, m_g2_data:51, q_total:404, q_ec:28, q_g1:4, q_g1_data:22, q_g2:4, q_g2_data:23, h_total:404, h_ec:24, h_g1:3, h_g1_data:12, h_g2:8, h_g2_data:13 }, + VersionRow { + l_total: 404, + l_ec: 20, + l_g1: 4, + l_g1_data: 81, + l_g2: 0, + l_g2_data: 0, + m_total: 404, + m_ec: 30, + m_g1: 1, + m_g1_data: 50, + m_g2: 4, + m_g2_data: 51, + q_total: 404, + q_ec: 28, + q_g1: 4, + q_g1_data: 22, + q_g2: 4, + q_g2_data: 23, + h_total: 404, + h_ec: 24, + h_g1: 3, + h_g1_data: 12, + h_g2: 8, + h_g2_data: 13, + }, // 版本 12 - VersionRow { l_total:466, l_ec:24, l_g1:2, l_g1_data:92, l_g2:2, l_g2_data:93, m_total:466, m_ec:22, m_g1:6, m_g1_data:36, m_g2:2, m_g2_data:37, q_total:466, q_ec:26, q_g1:4, q_g1_data:20, q_g2:6, q_g2_data:21, h_total:466, h_ec:28, h_g1:7, h_g1_data:14, h_g2:4, h_g2_data:15 }, + VersionRow { + l_total: 466, + l_ec: 24, + l_g1: 2, + l_g1_data: 92, + l_g2: 2, + l_g2_data: 93, + m_total: 466, + m_ec: 22, + m_g1: 6, + m_g1_data: 36, + m_g2: 2, + m_g2_data: 37, + q_total: 466, + q_ec: 26, + q_g1: 4, + q_g1_data: 20, + q_g2: 6, + q_g2_data: 21, + h_total: 466, + h_ec: 28, + h_g1: 7, + h_g1_data: 14, + h_g2: 4, + h_g2_data: 15, + }, // 版本 13 - VersionRow { l_total:532, l_ec:26, l_g1:4, l_g1_data:107, l_g2:0, l_g2_data:0, m_total:532, m_ec:22, m_g1:8, m_g1_data:37, m_g2:1, m_g2_data:38, q_total:532, q_ec:24, q_g1:8, q_g1_data:20, q_g2:4, q_g2_data:21, h_total:532, h_ec:22, h_g1:12, h_g1_data:11, h_g2:4, h_g2_data:12 }, + VersionRow { + l_total: 532, + l_ec: 26, + l_g1: 4, + l_g1_data: 107, + l_g2: 0, + l_g2_data: 0, + m_total: 532, + m_ec: 22, + m_g1: 8, + m_g1_data: 37, + m_g2: 1, + m_g2_data: 38, + q_total: 532, + q_ec: 24, + q_g1: 8, + q_g1_data: 20, + q_g2: 4, + q_g2_data: 21, + h_total: 532, + h_ec: 22, + h_g1: 12, + h_g1_data: 11, + h_g2: 4, + h_g2_data: 12, + }, // 版本 14 - VersionRow { l_total:581, l_ec:30, l_g1:3, l_g1_data:115, l_g2:1, l_g2_data:116, m_total:581, m_ec:24, m_g1:4, m_g1_data:40, m_g2:5, m_g2_data:41, q_total:581, q_ec:20, q_g1:11, q_g1_data:16, q_g2:5, q_g2_data:17, h_total:581, h_ec:24, h_g1:11, h_g1_data:12, h_g2:5, h_g2_data:13 }, + VersionRow { + l_total: 581, + l_ec: 30, + l_g1: 3, + l_g1_data: 115, + l_g2: 1, + l_g2_data: 116, + m_total: 581, + m_ec: 24, + m_g1: 4, + m_g1_data: 40, + m_g2: 5, + m_g2_data: 41, + q_total: 581, + q_ec: 20, + q_g1: 11, + q_g1_data: 16, + q_g2: 5, + q_g2_data: 17, + h_total: 581, + h_ec: 24, + h_g1: 11, + h_g1_data: 12, + h_g2: 5, + h_g2_data: 13, + }, // 版本 15 - VersionRow { l_total:655, l_ec:22, l_g1:5, l_g1_data:87, l_g2:1, l_g2_data:88, m_total:655, m_ec:24, m_g1:5, m_g1_data:41, m_g2:5, m_g2_data:42, q_total:655, q_ec:30, q_g1:5, q_g1_data:24, q_g2:7, q_g2_data:25, h_total:655, h_ec:24, h_g1:11, h_g1_data:12, h_g2:7, h_g2_data:13 }, + VersionRow { + l_total: 655, + l_ec: 22, + l_g1: 5, + l_g1_data: 87, + l_g2: 1, + l_g2_data: 88, + m_total: 655, + m_ec: 24, + m_g1: 5, + m_g1_data: 41, + m_g2: 5, + m_g2_data: 42, + q_total: 655, + q_ec: 30, + q_g1: 5, + q_g1_data: 24, + q_g2: 7, + q_g2_data: 25, + h_total: 655, + h_ec: 24, + h_g1: 11, + h_g1_data: 12, + h_g2: 7, + h_g2_data: 13, + }, // 版本 16 - VersionRow { l_total:733, l_ec:24, l_g1:5, l_g1_data:98, l_g2:1, l_g2_data:99, m_total:733, m_ec:28, m_g1:7, m_g1_data:45, m_g2:3, m_g2_data:46, q_total:733, q_ec:24, q_g1:15, q_g1_data:19, q_g2:2, q_g2_data:20, h_total:733, h_ec:30, h_g1:3, h_g1_data:15, h_g2:13, h_g2_data:16 }, + VersionRow { + l_total: 733, + l_ec: 24, + l_g1: 5, + l_g1_data: 98, + l_g2: 1, + l_g2_data: 99, + m_total: 733, + m_ec: 28, + m_g1: 7, + m_g1_data: 45, + m_g2: 3, + m_g2_data: 46, + q_total: 733, + q_ec: 24, + q_g1: 15, + q_g1_data: 19, + q_g2: 2, + q_g2_data: 20, + h_total: 733, + h_ec: 30, + h_g1: 3, + h_g1_data: 15, + h_g2: 13, + h_g2_data: 16, + }, // 版本 17 - VersionRow { l_total:815, l_ec:28, l_g1:1, l_g1_data:107, l_g2:5, l_g2_data:108, m_total:815, m_ec:28, m_g1:10, m_g1_data:46, m_g2:1, m_g2_data:47, q_total:815, q_ec:28, q_g1:1, q_g1_data:22, q_g2:15, q_g2_data:23, h_total:815, h_ec:28, h_g1:2, h_g1_data:14, h_g2:17, h_g2_data:15 }, + VersionRow { + l_total: 815, + l_ec: 28, + l_g1: 1, + l_g1_data: 107, + l_g2: 5, + l_g2_data: 108, + m_total: 815, + m_ec: 28, + m_g1: 10, + m_g1_data: 46, + m_g2: 1, + m_g2_data: 47, + q_total: 815, + q_ec: 28, + q_g1: 1, + q_g1_data: 22, + q_g2: 15, + q_g2_data: 23, + h_total: 815, + h_ec: 28, + h_g1: 2, + h_g1_data: 14, + h_g2: 17, + h_g2_data: 15, + }, // 版本 18 - VersionRow { l_total:901, l_ec:30, l_g1:5, l_g1_data:120, l_g2:1, l_g2_data:121, m_total:901, m_ec:26, m_g1:9, m_g1_data:43, m_g2:4, m_g2_data:44, q_total:901, q_ec:28, q_g1:17, q_g1_data:22, q_g2:1, q_g2_data:23, h_total:901, h_ec:28, h_g1:2, h_g1_data:14, h_g2:19, h_g2_data:15 }, + VersionRow { + l_total: 901, + l_ec: 30, + l_g1: 5, + l_g1_data: 120, + l_g2: 1, + l_g2_data: 121, + m_total: 901, + m_ec: 26, + m_g1: 9, + m_g1_data: 43, + m_g2: 4, + m_g2_data: 44, + q_total: 901, + q_ec: 28, + q_g1: 17, + q_g1_data: 22, + q_g2: 1, + q_g2_data: 23, + h_total: 901, + h_ec: 28, + h_g1: 2, + h_g1_data: 14, + h_g2: 19, + h_g2_data: 15, + }, // 版本 19 - VersionRow { l_total:991, l_ec:28, l_g1:3, l_g1_data:113, l_g2:4, l_g2_data:114, m_total:991, m_ec:26, m_g1:3, m_g1_data:44, m_g2:11, m_g2_data:45, q_total:991, q_ec:26, q_g1:17, q_g1_data:21, q_g2:4, q_g2_data:22, h_total:991, h_ec:26, h_g1:9, h_g1_data:13, h_g2:16, h_g2_data:14 }, + VersionRow { + l_total: 991, + l_ec: 28, + l_g1: 3, + l_g1_data: 113, + l_g2: 4, + l_g2_data: 114, + m_total: 991, + m_ec: 26, + m_g1: 3, + m_g1_data: 44, + m_g2: 11, + m_g2_data: 45, + q_total: 991, + q_ec: 26, + q_g1: 17, + q_g1_data: 21, + q_g2: 4, + q_g2_data: 22, + h_total: 991, + h_ec: 26, + h_g1: 9, + h_g1_data: 13, + h_g2: 16, + h_g2_data: 14, + }, // 版本 20 - VersionRow { l_total:1085, l_ec:28, l_g1:3, l_g1_data:107, l_g2:5, l_g2_data:108, m_total:1085, m_ec:26, m_g1:3, m_g1_data:41, m_g2:13, m_g2_data:42, q_total:1085, q_ec:30, q_g1:15, q_g1_data:24, q_g2:5, q_g2_data:25, h_total:1085, h_ec:28, h_g1:15, h_g1_data:15, h_g2:10, h_g2_data:16 }, + VersionRow { + l_total: 1085, + l_ec: 28, + l_g1: 3, + l_g1_data: 107, + l_g2: 5, + l_g2_data: 108, + m_total: 1085, + m_ec: 26, + m_g1: 3, + m_g1_data: 41, + m_g2: 13, + m_g2_data: 42, + q_total: 1085, + q_ec: 30, + q_g1: 15, + q_g1_data: 24, + q_g2: 5, + q_g2_data: 25, + h_total: 1085, + h_ec: 28, + h_g1: 15, + h_g1_data: 15, + h_g2: 10, + h_g2_data: 16, + }, // 版本 21 - VersionRow { l_total:1156, l_ec:28, l_g1:4, l_g1_data:116, l_g2:4, l_g2_data:117, m_total:1156, m_ec:26, m_g1:17, m_g1_data:42, m_g2:0, m_g2_data:0, q_total:1156, q_ec:28, q_g1:17, q_g1_data:22, q_g2:6, q_g2_data:23, h_total:1156, h_ec:30, h_g1:19, h_g1_data:16, h_g2:6, h_g2_data:17 }, + VersionRow { + l_total: 1156, + l_ec: 28, + l_g1: 4, + l_g1_data: 116, + l_g2: 4, + l_g2_data: 117, + m_total: 1156, + m_ec: 26, + m_g1: 17, + m_g1_data: 42, + m_g2: 0, + m_g2_data: 0, + q_total: 1156, + q_ec: 28, + q_g1: 17, + q_g1_data: 22, + q_g2: 6, + q_g2_data: 23, + h_total: 1156, + h_ec: 30, + h_g1: 19, + h_g1_data: 16, + h_g2: 6, + h_g2_data: 17, + }, // 版本 22 - VersionRow { l_total:1258, l_ec:28, l_g1:2, l_g1_data:111, l_g2:7, l_g2_data:112, m_total:1258, m_ec:28, m_g1:17, m_g1_data:46, m_g2:0, m_g2_data:0, q_total:1258, q_ec:30, q_g1:7, q_g1_data:24, q_g2:16, q_g2_data:25, h_total:1258, h_ec:24, h_g1:34, h_g1_data:13, h_g2:0, h_g2_data:0 }, + VersionRow { + l_total: 1258, + l_ec: 28, + l_g1: 2, + l_g1_data: 111, + l_g2: 7, + l_g2_data: 112, + m_total: 1258, + m_ec: 28, + m_g1: 17, + m_g1_data: 46, + m_g2: 0, + m_g2_data: 0, + q_total: 1258, + q_ec: 30, + q_g1: 7, + q_g1_data: 24, + q_g2: 16, + q_g2_data: 25, + h_total: 1258, + h_ec: 24, + h_g1: 34, + h_g1_data: 13, + h_g2: 0, + h_g2_data: 0, + }, // 版本 23 - VersionRow { l_total:1364, l_ec:30, l_g1:4, l_g1_data:121, l_g2:5, l_g2_data:122, m_total:1364, m_ec:28, m_g1:4, m_g1_data:47, m_g2:14, m_g2_data:48, q_total:1364, q_ec:30, q_g1:11, q_g1_data:24, q_g2:14, q_g2_data:25, h_total:1364, h_ec:30, h_g1:16, h_g1_data:15, h_g2:14, h_g2_data:16 }, + VersionRow { + l_total: 1364, + l_ec: 30, + l_g1: 4, + l_g1_data: 121, + l_g2: 5, + l_g2_data: 122, + m_total: 1364, + m_ec: 28, + m_g1: 4, + m_g1_data: 47, + m_g2: 14, + m_g2_data: 48, + q_total: 1364, + q_ec: 30, + q_g1: 11, + q_g1_data: 24, + q_g2: 14, + q_g2_data: 25, + h_total: 1364, + h_ec: 30, + h_g1: 16, + h_g1_data: 15, + h_g2: 14, + h_g2_data: 16, + }, // 版本 24 - VersionRow { l_total:1474, l_ec:30, l_g1:6, l_g1_data:117, l_g2:4, l_g2_data:118, m_total:1474, m_ec:28, m_g1:6, m_g1_data:45, m_g2:14, m_g2_data:46, q_total:1474, q_ec:30, q_g1:11, q_g1_data:24, q_g2:16, q_g2_data:25, h_total:1474, h_ec:30, h_g1:30, h_g1_data:16, h_g2:2, h_g2_data:17 }, + VersionRow { + l_total: 1474, + l_ec: 30, + l_g1: 6, + l_g1_data: 117, + l_g2: 4, + l_g2_data: 118, + m_total: 1474, + m_ec: 28, + m_g1: 6, + m_g1_data: 45, + m_g2: 14, + m_g2_data: 46, + q_total: 1474, + q_ec: 30, + q_g1: 11, + q_g1_data: 24, + q_g2: 16, + q_g2_data: 25, + h_total: 1474, + h_ec: 30, + h_g1: 30, + h_g1_data: 16, + h_g2: 2, + h_g2_data: 17, + }, // 版本 25 - VersionRow { l_total:1588, l_ec:26, l_g1:8, l_g1_data:106, l_g2:4, l_g2_data:107, m_total:1588, m_ec:28, m_g1:8, m_g1_data:47, m_g2:13, m_g2_data:48, q_total:1588, q_ec:30, q_g1:7, q_g1_data:24, q_g2:22, q_g2_data:25, h_total:1588, h_ec:30, h_g1:22, h_g1_data:15, h_g2:13, h_g2_data:16 }, + VersionRow { + l_total: 1588, + l_ec: 26, + l_g1: 8, + l_g1_data: 106, + l_g2: 4, + l_g2_data: 107, + m_total: 1588, + m_ec: 28, + m_g1: 8, + m_g1_data: 47, + m_g2: 13, + m_g2_data: 48, + q_total: 1588, + q_ec: 30, + q_g1: 7, + q_g1_data: 24, + q_g2: 22, + q_g2_data: 25, + h_total: 1588, + h_ec: 30, + h_g1: 22, + h_g1_data: 15, + h_g2: 13, + h_g2_data: 16, + }, // 版本 26 - VersionRow { l_total:1706, l_ec:28, l_g1:10, l_g1_data:114, l_g2:2, l_g2_data:115, m_total:1706, m_ec:28, m_g1:19, m_g1_data:46, m_g2:4, m_g2_data:47, q_total:1706, q_ec:28, q_g1:28, q_g1_data:22, q_g2:6, q_g2_data:23, h_total:1706, h_ec:30, h_g1:33, h_g1_data:16, h_g2:4, h_g2_data:17 }, + VersionRow { + l_total: 1706, + l_ec: 28, + l_g1: 10, + l_g1_data: 114, + l_g2: 2, + l_g2_data: 115, + m_total: 1706, + m_ec: 28, + m_g1: 19, + m_g1_data: 46, + m_g2: 4, + m_g2_data: 47, + q_total: 1706, + q_ec: 28, + q_g1: 28, + q_g1_data: 22, + q_g2: 6, + q_g2_data: 23, + h_total: 1706, + h_ec: 30, + h_g1: 33, + h_g1_data: 16, + h_g2: 4, + h_g2_data: 17, + }, // 版本 27 - VersionRow { l_total:1828, l_ec:30, l_g1:8, l_g1_data:122, l_g2:4, l_g2_data:123, m_total:1828, m_ec:28, m_g1:22, m_g1_data:45, m_g2:3, m_g2_data:46, q_total:1828, q_ec:30, q_g1:8, q_g1_data:23, q_g2:26, q_g2_data:24, h_total:1828, h_ec:30, h_g1:12, h_g1_data:15, h_g2:28, h_g2_data:16 }, + VersionRow { + l_total: 1828, + l_ec: 30, + l_g1: 8, + l_g1_data: 122, + l_g2: 4, + l_g2_data: 123, + m_total: 1828, + m_ec: 28, + m_g1: 22, + m_g1_data: 45, + m_g2: 3, + m_g2_data: 46, + q_total: 1828, + q_ec: 30, + q_g1: 8, + q_g1_data: 23, + q_g2: 26, + q_g2_data: 24, + h_total: 1828, + h_ec: 30, + h_g1: 12, + h_g1_data: 15, + h_g2: 28, + h_g2_data: 16, + }, // 版本 28 - VersionRow { l_total:1921, l_ec:30, l_g1:3, l_g1_data:117, l_g2:10, l_g2_data:118, m_total:1921, m_ec:28, m_g1:3, m_g1_data:45, m_g2:23, m_g2_data:46, q_total:1921, q_ec:30, q_g1:4, q_g1_data:24, q_g2:31, q_g2_data:25, h_total:1921, h_ec:30, h_g1:11, h_g1_data:15, h_g2:31, h_g2_data:16 }, + VersionRow { + l_total: 1921, + l_ec: 30, + l_g1: 3, + l_g1_data: 117, + l_g2: 10, + l_g2_data: 118, + m_total: 1921, + m_ec: 28, + m_g1: 3, + m_g1_data: 45, + m_g2: 23, + m_g2_data: 46, + q_total: 1921, + q_ec: 30, + q_g1: 4, + q_g1_data: 24, + q_g2: 31, + q_g2_data: 25, + h_total: 1921, + h_ec: 30, + h_g1: 11, + h_g1_data: 15, + h_g2: 31, + h_g2_data: 16, + }, // 版本 29 - VersionRow { l_total:2051, l_ec:30, l_g1:7, l_g1_data:116, l_g2:7, l_g2_data:117, m_total:2051, m_ec:28, m_g1:21, m_g1_data:45, m_g2:7, m_g2_data:46, q_total:2051, q_ec:30, q_g1:1, q_g1_data:23, q_g2:37, q_g2_data:24, h_total:2051, h_ec:30, h_g1:19, h_g1_data:15, h_g2:26, h_g2_data:16 }, + VersionRow { + l_total: 2051, + l_ec: 30, + l_g1: 7, + l_g1_data: 116, + l_g2: 7, + l_g2_data: 117, + m_total: 2051, + m_ec: 28, + m_g1: 21, + m_g1_data: 45, + m_g2: 7, + m_g2_data: 46, + q_total: 2051, + q_ec: 30, + q_g1: 1, + q_g1_data: 23, + q_g2: 37, + q_g2_data: 24, + h_total: 2051, + h_ec: 30, + h_g1: 19, + h_g1_data: 15, + h_g2: 26, + h_g2_data: 16, + }, // 版本 30 - VersionRow { l_total:2185, l_ec:30, l_g1:5, l_g1_data:115, l_g2:10, l_g2_data:116, m_total:2185, m_ec:28, m_g1:19, m_g1_data:47, m_g2:10, m_g2_data:48, q_total:2185, q_ec:30, q_g1:15, q_g1_data:24, q_g2:25, q_g2_data:25, h_total:2185, h_ec:30, h_g1:23, h_g1_data:15, h_g2:25, h_g2_data:16 }, + VersionRow { + l_total: 2185, + l_ec: 30, + l_g1: 5, + l_g1_data: 115, + l_g2: 10, + l_g2_data: 116, + m_total: 2185, + m_ec: 28, + m_g1: 19, + m_g1_data: 47, + m_g2: 10, + m_g2_data: 48, + q_total: 2185, + q_ec: 30, + q_g1: 15, + q_g1_data: 24, + q_g2: 25, + q_g2_data: 25, + h_total: 2185, + h_ec: 30, + h_g1: 23, + h_g1_data: 15, + h_g2: 25, + h_g2_data: 16, + }, // 版本 31 - VersionRow { l_total:2323, l_ec:30, l_g1:13, l_g1_data:115, l_g2:3, l_g2_data:116, m_total:2323, m_ec:28, m_g1:2, m_g1_data:46, m_g2:29, m_g2_data:47, q_total:2323, q_ec:30, q_g1:42, q_g1_data:24, q_g2:1, q_g2_data:25, h_total:2323, h_ec:30, h_g1:23, h_g1_data:15, h_g2:28, h_g2_data:16 }, + VersionRow { + l_total: 2323, + l_ec: 30, + l_g1: 13, + l_g1_data: 115, + l_g2: 3, + l_g2_data: 116, + m_total: 2323, + m_ec: 28, + m_g1: 2, + m_g1_data: 46, + m_g2: 29, + m_g2_data: 47, + q_total: 2323, + q_ec: 30, + q_g1: 42, + q_g1_data: 24, + q_g2: 1, + q_g2_data: 25, + h_total: 2323, + h_ec: 30, + h_g1: 23, + h_g1_data: 15, + h_g2: 28, + h_g2_data: 16, + }, // 版本 32 - VersionRow { l_total:2465, l_ec:30, l_g1:17, l_g1_data:115, l_g2:0, l_g2_data:0, m_total:2465, m_ec:28, m_g1:10, m_g1_data:46, m_g2:23, m_g2_data:47, q_total:2465, q_ec:30, q_g1:10, q_g1_data:24, q_g2:35, q_g2_data:25, h_total:2465, h_ec:30, h_g1:19, h_g1_data:15, h_g2:35, h_g2_data:16 }, + VersionRow { + l_total: 2465, + l_ec: 30, + l_g1: 17, + l_g1_data: 115, + l_g2: 0, + l_g2_data: 0, + m_total: 2465, + m_ec: 28, + m_g1: 10, + m_g1_data: 46, + m_g2: 23, + m_g2_data: 47, + q_total: 2465, + q_ec: 30, + q_g1: 10, + q_g1_data: 24, + q_g2: 35, + q_g2_data: 25, + h_total: 2465, + h_ec: 30, + h_g1: 19, + h_g1_data: 15, + h_g2: 35, + h_g2_data: 16, + }, // 版本 33 - VersionRow { l_total:2611, l_ec:30, l_g1:17, l_g1_data:115, l_g2:1, l_g2_data:116, m_total:2611, m_ec:28, m_g1:14, m_g1_data:46, m_g2:21, m_g2_data:47, q_total:2611, q_ec:30, q_g1:29, q_g1_data:24, q_g2:19, q_g2_data:25, h_total:2611, h_ec:30, h_g1:11, h_g1_data:15, h_g2:46, h_g2_data:16 }, + VersionRow { + l_total: 2611, + l_ec: 30, + l_g1: 17, + l_g1_data: 115, + l_g2: 1, + l_g2_data: 116, + m_total: 2611, + m_ec: 28, + m_g1: 14, + m_g1_data: 46, + m_g2: 21, + m_g2_data: 47, + q_total: 2611, + q_ec: 30, + q_g1: 29, + q_g1_data: 24, + q_g2: 19, + q_g2_data: 25, + h_total: 2611, + h_ec: 30, + h_g1: 11, + h_g1_data: 15, + h_g2: 46, + h_g2_data: 16, + }, // 版本 34 - VersionRow { l_total:2761, l_ec:30, l_g1:13, l_g1_data:115, l_g2:6, l_g2_data:116, m_total:2761, m_ec:28, m_g1:14, m_g1_data:46, m_g2:23, m_g2_data:47, q_total:2761, q_ec:30, q_g1:44, q_g1_data:24, q_g2:7, q_g2_data:25, h_total:2761, h_ec:30, h_g1:59, h_g1_data:16, h_g2:1, h_g2_data:17 }, + VersionRow { + l_total: 2761, + l_ec: 30, + l_g1: 13, + l_g1_data: 115, + l_g2: 6, + l_g2_data: 116, + m_total: 2761, + m_ec: 28, + m_g1: 14, + m_g1_data: 46, + m_g2: 23, + m_g2_data: 47, + q_total: 2761, + q_ec: 30, + q_g1: 44, + q_g1_data: 24, + q_g2: 7, + q_g2_data: 25, + h_total: 2761, + h_ec: 30, + h_g1: 59, + h_g1_data: 16, + h_g2: 1, + h_g2_data: 17, + }, // 版本 35 - VersionRow { l_total:2876, l_ec:30, l_g1:12, l_g1_data:121, l_g2:7, l_g2_data:122, m_total:2876, m_ec:28, m_g1:12, m_g1_data:47, m_g2:26, m_g2_data:48, q_total:2876, q_ec:30, q_g1:39, q_g1_data:24, q_g2:14, q_g2_data:25, h_total:2876, h_ec:30, h_g1:22, h_g1_data:15, h_g2:41, h_g2_data:16 }, + VersionRow { + l_total: 2876, + l_ec: 30, + l_g1: 12, + l_g1_data: 121, + l_g2: 7, + l_g2_data: 122, + m_total: 2876, + m_ec: 28, + m_g1: 12, + m_g1_data: 47, + m_g2: 26, + m_g2_data: 48, + q_total: 2876, + q_ec: 30, + q_g1: 39, + q_g1_data: 24, + q_g2: 14, + q_g2_data: 25, + h_total: 2876, + h_ec: 30, + h_g1: 22, + h_g1_data: 15, + h_g2: 41, + h_g2_data: 16, + }, // 版本 36 - VersionRow { l_total:3034, l_ec:30, l_g1:6, l_g1_data:121, l_g2:14, l_g2_data:122, m_total:3034, m_ec:28, m_g1:6, m_g1_data:47, m_g2:34, m_g2_data:48, q_total:3034, q_ec:30, q_g1:46, q_g1_data:24, q_g2:10, q_g2_data:25, h_total:3034, h_ec:30, h_g1:2, h_g1_data:15, h_g2:64, h_g2_data:16 }, + VersionRow { + l_total: 3034, + l_ec: 30, + l_g1: 6, + l_g1_data: 121, + l_g2: 14, + l_g2_data: 122, + m_total: 3034, + m_ec: 28, + m_g1: 6, + m_g1_data: 47, + m_g2: 34, + m_g2_data: 48, + q_total: 3034, + q_ec: 30, + q_g1: 46, + q_g1_data: 24, + q_g2: 10, + q_g2_data: 25, + h_total: 3034, + h_ec: 30, + h_g1: 2, + h_g1_data: 15, + h_g2: 64, + h_g2_data: 16, + }, // 版本 37 - VersionRow { l_total:3196, l_ec:30, l_g1:17, l_g1_data:122, l_g2:4, l_g2_data:123, m_total:3196, m_ec:28, m_g1:29, m_g1_data:46, m_g2:14, m_g2_data:47, q_total:3196, q_ec:30, q_g1:49, q_g1_data:24, q_g2:10, q_g2_data:25, h_total:3196, h_ec:30, h_g1:24, h_g1_data:15, h_g2:46, h_g2_data:16 }, + VersionRow { + l_total: 3196, + l_ec: 30, + l_g1: 17, + l_g1_data: 122, + l_g2: 4, + l_g2_data: 123, + m_total: 3196, + m_ec: 28, + m_g1: 29, + m_g1_data: 46, + m_g2: 14, + m_g2_data: 47, + q_total: 3196, + q_ec: 30, + q_g1: 49, + q_g1_data: 24, + q_g2: 10, + q_g2_data: 25, + h_total: 3196, + h_ec: 30, + h_g1: 24, + h_g1_data: 15, + h_g2: 46, + h_g2_data: 16, + }, // 版本 38 - VersionRow { l_total:3362, l_ec:30, l_g1:4, l_g1_data:122, l_g2:18, l_g2_data:123, m_total:3362, m_ec:28, m_g1:13, m_g1_data:46, m_g2:32, m_g2_data:47, q_total:3362, q_ec:30, q_g1:48, q_g1_data:24, q_g2:14, q_g2_data:25, h_total:3362, h_ec:30, h_g1:42, h_g1_data:15, h_g2:32, h_g2_data:16 }, + VersionRow { + l_total: 3362, + l_ec: 30, + l_g1: 4, + l_g1_data: 122, + l_g2: 18, + l_g2_data: 123, + m_total: 3362, + m_ec: 28, + m_g1: 13, + m_g1_data: 46, + m_g2: 32, + m_g2_data: 47, + q_total: 3362, + q_ec: 30, + q_g1: 48, + q_g1_data: 24, + q_g2: 14, + q_g2_data: 25, + h_total: 3362, + h_ec: 30, + h_g1: 42, + h_g1_data: 15, + h_g2: 32, + h_g2_data: 16, + }, // 版本 39 - VersionRow { l_total:3532, l_ec:30, l_g1:20, l_g1_data:117, l_g2:4, l_g2_data:118, m_total:3532, m_ec:28, m_g1:40, m_g1_data:47, m_g2:7, m_g2_data:48, q_total:3532, q_ec:30, q_g1:43, q_g1_data:24, q_g2:22, q_g2_data:25, h_total:3532, h_ec:30, h_g1:10, h_g1_data:15, h_g2:67, h_g2_data:16 }, + VersionRow { + l_total: 3532, + l_ec: 30, + l_g1: 20, + l_g1_data: 117, + l_g2: 4, + l_g2_data: 118, + m_total: 3532, + m_ec: 28, + m_g1: 40, + m_g1_data: 47, + m_g2: 7, + m_g2_data: 48, + q_total: 3532, + q_ec: 30, + q_g1: 43, + q_g1_data: 24, + q_g2: 22, + q_g2_data: 25, + h_total: 3532, + h_ec: 30, + h_g1: 10, + h_g1_data: 15, + h_g2: 67, + h_g2_data: 16, + }, // 版本 40 - VersionRow { l_total:3706, l_ec:30, l_g1:19, l_g1_data:118, l_g2:6, l_g2_data:119, m_total:3706, m_ec:28, m_g1:18, m_g1_data:47, m_g2:31, m_g2_data:48, q_total:3706, q_ec:30, q_g1:34, q_g1_data:24, q_g2:34, q_g2_data:25, h_total:3706, h_ec:30, h_g1:20, h_g1_data:15, h_g2:61, h_g2_data:16 }, + VersionRow { + l_total: 3706, + l_ec: 30, + l_g1: 19, + l_g1_data: 118, + l_g2: 6, + l_g2_data: 119, + m_total: 3706, + m_ec: 28, + m_g1: 18, + m_g1_data: 47, + m_g2: 31, + m_g2_data: 48, + q_total: 3706, + q_ec: 30, + q_g1: 34, + q_g1_data: 24, + q_g2: 34, + q_g2_data: 25, + h_total: 3706, + h_ec: 30, + h_g1: 20, + h_g1_data: 15, + h_g2: 61, + h_g2_data: 16, + }, ]; // 对齐图案中心位置表(每个版本的坐标数组) static ALIGNMENT_POSITIONS: [&[u8]; 40] = [ - &[], // v1 (无对齐图案) - &[6, 18], // v2 - &[6, 22], // v3 - &[6, 26], // v4 - &[6, 30], // v5 - &[6, 34], // v6 - &[6, 22, 38], // v7 - &[6, 24, 42], // v8 - &[6, 26, 46], // v9 - &[6, 28, 50], // v10 - &[6, 30, 54], // v11 - &[6, 32, 58], // v12 - &[6, 34, 62], // v13 - &[6, 26, 46, 66], // v14 - &[6, 26, 48, 70], // v15 - &[6, 26, 50, 74], // v16 - &[6, 30, 54, 78], // v17 - &[6, 30, 56, 82], // v18 - &[6, 30, 58, 86], // v19 - &[6, 34, 62, 90], // v20 - &[6, 28, 50, 72, 94], // v21 - &[6, 26, 50, 74, 98], // v22 - &[6, 30, 54, 78, 102], // v23 - &[6, 28, 54, 80, 106], // v24 - &[6, 32, 58, 84, 110], // v25 - &[6, 30, 58, 86, 114], // v26 - &[6, 34, 62, 90, 118], // v27 - &[6, 26, 50, 74, 98, 122], // v28 - &[6, 30, 54, 78, 102, 126], // v29 - &[6, 26, 52, 78, 104, 130], // v30 - &[6, 30, 56, 82, 108, 134], // v31 - &[6, 34, 60, 86, 112, 138], // v32 - &[6, 30, 58, 86, 114, 142], // v33 - &[6, 34, 62, 90, 118, 146], // v34 - &[6, 30, 54, 78, 102, 126, 150], // v35 - &[6, 24, 50, 76, 102, 128, 154], // v36 - &[6, 28, 54, 80, 106, 132, 158], // v37 - &[6, 32, 58, 84, 110, 136, 162], // v38 - &[6, 26, 54, 82, 110, 138, 166], // v39 - &[6, 30, 58, 86, 114, 142, 170], // v40 + &[], // v1 (无对齐图案) + &[6, 18], // v2 + &[6, 22], // v3 + &[6, 26], // v4 + &[6, 30], // v5 + &[6, 34], // v6 + &[6, 22, 38], // v7 + &[6, 24, 42], // v8 + &[6, 26, 46], // v9 + &[6, 28, 50], // v10 + &[6, 30, 54], // v11 + &[6, 32, 58], // v12 + &[6, 34, 62], // v13 + &[6, 26, 46, 66], // v14 + &[6, 26, 48, 70], // v15 + &[6, 26, 50, 74], // v16 + &[6, 30, 54, 78], // v17 + &[6, 30, 56, 82], // v18 + &[6, 30, 58, 86], // v19 + &[6, 34, 62, 90], // v20 + &[6, 28, 50, 72, 94], // v21 + &[6, 26, 50, 74, 98], // v22 + &[6, 30, 54, 78, 102], // v23 + &[6, 28, 54, 80, 106], // v24 + &[6, 32, 58, 84, 110], // v25 + &[6, 30, 58, 86, 114], // v26 + &[6, 34, 62, 90, 118], // v27 + &[6, 26, 50, 74, 98, 122], // v28 + &[6, 30, 54, 78, 102, 126], // v29 + &[6, 26, 52, 78, 104, 130], // v30 + &[6, 30, 56, 82, 108, 134], // v31 + &[6, 34, 60, 86, 112, 138], // v32 + &[6, 30, 58, 86, 114, 142], // v33 + &[6, 34, 62, 90, 118, 146], // v34 + &[6, 30, 54, 78, 102, 126, 150], // v35 + &[6, 24, 50, 76, 102, 128, 154], // v36 + &[6, 28, 54, 80, 106, 132, 158], // v37 + &[6, 32, 58, 84, 110, 136, 162], // v38 + &[6, 26, 54, 82, 110, 138, 166], // v39 + &[6, 30, 58, 86, 114, 142, 170], // v40 ]; /// 获取某版本+级别的数据码字容量 @@ -217,9 +1275,7 @@ fn init_capacity_table() -> [[u16; 4]; 40] { let li: [EcLevel; 4] = [EcLevel::L, EcLevel::M, EcLevel::Q, EcLevel::H]; for (idx, &level) in li.iter().enumerate() { let info = ver.ec_info(level); - let total_data: u16 = info.blocks.iter() - .map(|b| b.count * b.data_codewords) - .sum(); + let total_data: u16 = info.blocks.iter().map(|b| b.count * b.data_codewords).sum(); table[v as usize - 1][idx] = total_data; } } diff --git a/core/tests/integration_test.rs b/core/tests/integration_test.rs index d1b2bcc..be946f1 100644 --- a/core/tests/integration_test.rs +++ b/core/tests/integration_test.rs @@ -12,7 +12,10 @@ fn test_encode_simple_text() { #[test] fn test_all_levels() { for level in [EcLevel::L, EcLevel::M, EcLevel::Q, EcLevel::H] { - let config = QrConfig { level, ..Default::default() }; + let config = QrConfig { + level, + ..Default::default() + }; let qr = QrCode::encode("TEST", config).unwrap(); assert!(qr.size() >= 21); assert!(qr.size() <= 177); @@ -113,7 +116,10 @@ fn test_margin_is_included_in_dimensions() { let ascii = qr.to_ascii(false); let first_line = ascii.lines().next().unwrap(); let chars_per_module = 2; // ██ 是两个字符 - assert_eq!(first_line.chars().count(), expected_total as usize * chars_per_module); + assert_eq!( + first_line.chars().count(), + expected_total as usize * chars_per_module + ); } #[test]