Current section
Files
Jump to
Current section
Files
lib/eqrcode/spec_table.ex
defmodule EQRCode.SpecTable do @type error_correction_level :: :l | :m | :q | :h @type version :: 1..40 @type mode :: :numeric | :alphanumeric | :byte | :kenji | :eci def error_correction_level(), do: [:l, :m, :q, :h] @mode [ numeric: 0b0001, alphanumeric: 0b0010, byte: 0b0100, kanji: 0b1000, eci: 0b0111 ] @error_corretion_bits [ l: 0b01, m: 0b00, q: 0b11, h: 0b10 ] @version_information_bits [ {7, 0b000111110010010100}, {8, 0b001000010110111100}, {9, 0b001001101010011001}, {10, 0b001010010011010011}, {11, 0b001011101111110110}, {12, 0b001100011101100010}, {13, 0b001101100001000111}, {14, 0b001110011000001101}, {15, 0b001111100100101000}, {16, 0b010000101101111000}, {17, 0b010001010001011101}, {18, 0b010010101000010111}, {19, 0b010011010100110010}, {20, 0b010100100110100110}, {21, 0b010101011010000011}, {22, 0b010110100011001001}, {23, 0b010111011111101100}, {24, 0b011000111011000100}, {25, 0b011001000111100001}, {26, 0b011010111110101011}, {27, 0b011011000010001110}, {28, 0b011100110000011010}, {29, 0b011101001100111111}, {30, 0b011110110101110101}, {31, 0b011111001001010000}, {32, 0b100000100111010101}, {33, 0b100001011011110000}, {34, 0b100010100010111010}, {35, 0b100011011110011111}, {36, 0b100100101100001011}, {37, 0b100101010000101110}, {38, 0b100110101001100100}, {39, 0b100111010101000001}, {40, 0b101000110001101001} ] @spec version_information_bits(version()) :: 1..1_114_111 def version_information_bits(version) for {version, bits} <- @version_information_bits do def version_information_bits(unquote(version)), do: unquote(bits) end @spec error_corretion_bits(error_correction_level()) :: 1..3 def error_corretion_bits(error_correction_level) for {level, bits} <- @error_corretion_bits do def error_corretion_bits(unquote(level)), do: unquote(bits) end def mode_indicator(mode \\ :byte) for {mode, mode_indictor} <- @mode do def mode_indicator(unquote(mode)), do: unquote(mode_indictor) end # {:version, :error_correction_level, :mode, :capacity, :character_count_indicator_bits} @table [ {1, :l, :numeric, 41, 10}, {1, :l, :alphanumeric, 25, 9}, {1, :l, :byte, 17, 8}, {1, :l, :kenji, 10, 8}, {1, :m, :numeric, 34, 10}, {1, :m, :alphanumeric, 20, 9}, {1, :m, :byte, 14, 8}, {1, :m, :kenji, 8, 8}, {1, :q, :numeric, 27, 10}, {1, :q, :alphanumeric, 16, 9}, {1, :q, :byte, 11, 8}, {1, :q, :kenji, 7, 8}, {1, :h, :numeric, 17, 10}, {1, :h, :alphanumeric, 10, 9}, {1, :h, :byte, 7, 8}, {1, :h, :kenji, 4, 8}, {2, :l, :numeric, 77, 10}, {2, :l, :alphanumeric, 47, 9}, {2, :l, :byte, 32, 8}, {2, :l, :kenji, 20, 8}, {2, :m, :numeric, 63, 10}, {2, :m, :alphanumeric, 38, 9}, {2, :m, :byte, 26, 8}, {2, :m, :kenji, 16, 8}, {2, :q, :numeric, 48, 10}, {2, :q, :alphanumeric, 29, 9}, {2, :q, :byte, 20, 8}, {2, :q, :kenji, 12, 8}, {2, :h, :numeric, 34, 10}, {2, :h, :alphanumeric, 20, 9}, {2, :h, :byte, 14, 8}, {2, :h, :kenji, 8, 8}, {3, :l, :numeric, 127, 10}, {3, :l, :alphanumeric, 77, 9}, {3, :l, :byte, 53, 8}, {3, :l, :kenji, 32, 8}, {3, :m, :numeric, 101, 10}, {3, :m, :alphanumeric, 61, 9}, {3, :m, :byte, 42, 8}, {3, :m, :kenji, 26, 8}, {3, :q, :numeric, 77, 10}, {3, :q, :alphanumeric, 47, 9}, {3, :q, :byte, 32, 8}, {3, :q, :kenji, 20, 8}, {3, :h, :numeric, 58, 10}, {3, :h, :alphanumeric, 35, 9}, {3, :h, :byte, 24, 8}, {3, :h, :kenji, 15, 8}, {4, :l, :numeric, 187, 10}, {4, :l, :alphanumeric, 114, 9}, {4, :l, :byte, 78, 8}, {4, :l, :kenji, 48, 8}, {4, :m, :numeric, 149, 10}, {4, :m, :alphanumeric, 90, 9}, {4, :m, :byte, 62, 8}, {4, :m, :kenji, 38, 8}, {4, :q, :numeric, 111, 10}, {4, :q, :alphanumeric, 67, 9}, {4, :q, :byte, 46, 8}, {4, :q, :kenji, 28, 8}, {4, :h, :numeric, 82, 10}, {4, :h, :alphanumeric, 50, 9}, {4, :h, :byte, 34, 8}, {4, :h, :kenji, 21, 8}, {5, :l, :numeric, 255, 10}, {5, :l, :alphanumeric, 154, 9}, {5, :l, :byte, 106, 8}, {5, :l, :kenji, 65, 8}, {5, :m, :numeric, 202, 10}, {5, :m, :alphanumeric, 122, 9}, {5, :m, :byte, 84, 8}, {5, :m, :kenji, 52, 8}, {5, :q, :numeric, 144, 10}, {5, :q, :alphanumeric, 87, 9}, {5, :q, :byte, 60, 8}, {5, :q, :kenji, 37, 8}, {5, :h, :numeric, 106, 10}, {5, :h, :alphanumeric, 64, 9}, {5, :h, :byte, 44, 8}, {5, :h, :kenji, 27, 8}, {6, :l, :numeric, 322, 10}, {6, :l, :alphanumeric, 195, 9}, {6, :l, :byte, 134, 8}, {6, :l, :kenji, 82, 8}, {6, :m, :numeric, 255, 10}, {6, :m, :alphanumeric, 154, 9}, {6, :m, :byte, 106, 8}, {6, :m, :kenji, 65, 8}, {6, :q, :numeric, 178, 10}, {6, :q, :alphanumeric, 108, 9}, {6, :q, :byte, 74, 8}, {6, :q, :kenji, 45, 8}, {6, :h, :numeric, 139, 10}, {6, :h, :alphanumeric, 84, 9}, {6, :h, :byte, 58, 8}, {6, :h, :kenji, 36, 8}, {7, :l, :numeric, 370, 10}, {7, :l, :alphanumeric, 224, 9}, {7, :l, :byte, 154, 8}, {7, :l, :kenji, 95, 8}, {7, :m, :numeric, 293, 10}, {7, :m, :alphanumeric, 178, 9}, {7, :m, :byte, 122, 8}, {7, :m, :kenji, 75, 8}, {7, :q, :numeric, 207, 10}, {7, :q, :alphanumeric, 125, 9}, {7, :q, :byte, 86, 8}, {7, :q, :kenji, 53, 8}, {7, :h, :numeric, 154, 10}, {7, :h, :alphanumeric, 93, 9}, {7, :h, :byte, 64, 8}, {7, :h, :kenji, 39, 8}, {8, :l, :numeric, 461, 10}, {8, :l, :alphanumeric, 279, 9}, {8, :l, :byte, 192, 8}, {8, :l, :kenji, 118, 8}, {8, :m, :numeric, 365, 10}, {8, :m, :alphanumeric, 221, 9}, {8, :m, :byte, 152, 8}, {8, :m, :kenji, 93, 8}, {8, :q, :numeric, 259, 10}, {8, :q, :alphanumeric, 157, 9}, {8, :q, :byte, 108, 8}, {8, :q, :kenji, 66, 8}, {8, :h, :numeric, 202, 10}, {8, :h, :alphanumeric, 122, 9}, {8, :h, :byte, 84, 8}, {8, :h, :kenji, 52, 8}, {9, :l, :numeric, 552, 10}, {9, :l, :alphanumeric, 335, 9}, {9, :l, :byte, 230, 8}, {9, :l, :kenji, 141, 8}, {9, :m, :numeric, 432, 10}, {9, :m, :alphanumeric, 262, 9}, {9, :m, :byte, 180, 8}, {9, :m, :kenji, 111, 8}, {9, :q, :numeric, 312, 10}, {9, :q, :alphanumeric, 189, 9}, {9, :q, :byte, 130, 8}, {9, :q, :kenji, 80, 8}, {9, :h, :numeric, 235, 10}, {9, :h, :alphanumeric, 143, 9}, {9, :h, :byte, 98, 8}, {9, :h, :kenji, 60, 8}, {10, :l, :numeric, 652, 12}, {10, :l, :alphanumeric, 395, 11}, {10, :l, :byte, 271, 16}, {10, :l, :kenji, 167, 10}, {10, :m, :numeric, 513, 12}, {10, :m, :alphanumeric, 311, 11}, {10, :m, :byte, 213, 16}, {10, :m, :kenji, 131, 10}, {10, :q, :numeric, 364, 12}, {10, :q, :alphanumeric, 221, 11}, {10, :q, :byte, 151, 16}, {10, :q, :kenji, 93, 10}, {10, :h, :numeric, 288, 12}, {10, :h, :alphanumeric, 174, 11}, {10, :h, :byte, 119, 16}, {10, :h, :kenji, 74, 10}, {11, :l, :numeric, 772, 12}, {11, :l, :alphanumeric, 468, 11}, {11, :l, :byte, 321, 16}, {11, :l, :kenji, 198, 10}, {11, :m, :numeric, 604, 12}, {11, :m, :alphanumeric, 366, 11}, {11, :m, :byte, 251, 16}, {11, :m, :kenji, 155, 10}, {11, :q, :numeric, 427, 12}, {11, :q, :alphanumeric, 259, 11}, {11, :q, :byte, 177, 16}, {11, :q, :kenji, 109, 10}, {11, :h, :numeric, 331, 12}, {11, :h, :alphanumeric, 200, 11}, {11, :h, :byte, 137, 16}, {11, :h, :kenji, 85, 10}, {12, :l, :numeric, 883, 12}, {12, :l, :alphanumeric, 535, 11}, {12, :l, :byte, 367, 16}, {12, :l, :kenji, 226, 10}, {12, :m, :numeric, 691, 12}, {12, :m, :alphanumeric, 419, 11}, {12, :m, :byte, 287, 16}, {12, :m, :kenji, 177, 10}, {12, :q, :numeric, 489, 12}, {12, :q, :alphanumeric, 296, 11}, {12, :q, :byte, 203, 16}, {12, :q, :kenji, 125, 10}, {12, :h, :numeric, 374, 12}, {12, :h, :alphanumeric, 227, 11}, {12, :h, :byte, 155, 16}, {12, :h, :kenji, 96, 10}, {13, :l, :numeric, 1022, 12}, {13, :l, :alphanumeric, 619, 11}, {13, :l, :byte, 425, 16}, {13, :l, :kenji, 262, 10}, {13, :m, :numeric, 796, 12}, {13, :m, :alphanumeric, 483, 11}, {13, :m, :byte, 331, 16}, {13, :m, :kenji, 204, 10}, {13, :q, :numeric, 580, 12}, {13, :q, :alphanumeric, 352, 11}, {13, :q, :byte, 241, 16}, {13, :q, :kenji, 149, 10}, {13, :h, :numeric, 427, 12}, {13, :h, :alphanumeric, 259, 11}, {13, :h, :byte, 177, 16}, {13, :h, :kenji, 109, 10}, {14, :l, :numeric, 1101, 12}, {14, :l, :alphanumeric, 667, 11}, {14, :l, :byte, 458, 16}, {14, :l, :kenji, 282, 10}, {14, :m, :numeric, 871, 12}, {14, :m, :alphanumeric, 528, 11}, {14, :m, :byte, 362, 16}, {14, :m, :kenji, 223, 10}, {14, :q, :numeric, 621, 12}, {14, :q, :alphanumeric, 376, 11}, {14, :q, :byte, 258, 16}, {14, :q, :kenji, 159, 10}, {14, :h, :numeric, 468, 12}, {14, :h, :alphanumeric, 283, 11}, {14, :h, :byte, 194, 16}, {14, :h, :kenji, 120, 10}, {15, :l, :numeric, 1250, 12}, {15, :l, :alphanumeric, 758, 11}, {15, :l, :byte, 520, 16}, {15, :l, :kenji, 320, 10}, {15, :m, :numeric, 991, 12}, {15, :m, :alphanumeric, 600, 11}, {15, :m, :byte, 412, 16}, {15, :m, :kenji, 254, 10}, {15, :q, :numeric, 703, 12}, {15, :q, :alphanumeric, 426, 11}, {15, :q, :byte, 292, 16}, {15, :q, :kenji, 180, 10}, {15, :h, :numeric, 530, 12}, {15, :h, :alphanumeric, 321, 11}, {15, :h, :byte, 220, 16}, {15, :h, :kenji, 136, 10}, {16, :l, :numeric, 1408, 12}, {16, :l, :alphanumeric, 854, 11}, {16, :l, :byte, 586, 16}, {16, :l, :kenji, 361, 10}, {16, :m, :numeric, 1082, 12}, {16, :m, :alphanumeric, 656, 11}, {16, :m, :byte, 450, 16}, {16, :m, :kenji, 277, 10}, {16, :q, :numeric, 775, 12}, {16, :q, :alphanumeric, 470, 11}, {16, :q, :byte, 322, 16}, {16, :q, :kenji, 198, 10}, {16, :h, :numeric, 602, 12}, {16, :h, :alphanumeric, 365, 11}, {16, :h, :byte, 250, 16}, {16, :h, :kenji, 154, 10}, {17, :l, :numeric, 1548, 12}, {17, :l, :alphanumeric, 938, 11}, {17, :l, :byte, 644, 16}, {17, :l, :kenji, 397, 10}, {17, :m, :numeric, 1212, 12}, {17, :m, :alphanumeric, 734, 11}, {17, :m, :byte, 504, 16}, {17, :m, :kenji, 310, 10}, {17, :q, :numeric, 876, 12}, {17, :q, :alphanumeric, 531, 11}, {17, :q, :byte, 364, 16}, {17, :q, :kenji, 224, 10}, {17, :h, :numeric, 674, 12}, {17, :h, :alphanumeric, 408, 11}, {17, :h, :byte, 280, 16}, {17, :h, :kenji, 173, 10}, {18, :l, :numeric, 1725, 12}, {18, :l, :alphanumeric, 1046, 11}, {18, :l, :byte, 718, 16}, {18, :l, :kenji, 442, 10}, {18, :m, :numeric, 1346, 12}, {18, :m, :alphanumeric, 816, 11}, {18, :m, :byte, 560, 16}, {18, :m, :kenji, 345, 10}, {18, :q, :numeric, 948, 12}, {18, :q, :alphanumeric, 574, 11}, {18, :q, :byte, 394, 16}, {18, :q, :kenji, 243, 10}, {18, :h, :numeric, 746, 12}, {18, :h, :alphanumeric, 452, 11}, {18, :h, :byte, 310, 16}, {18, :h, :kenji, 191, 10}, {19, :l, :numeric, 1903, 12}, {19, :l, :alphanumeric, 1153, 11}, {19, :l, :byte, 792, 16}, {19, :l, :kenji, 488, 10}, {19, :m, :numeric, 1500, 12}, {19, :m, :alphanumeric, 909, 11}, {19, :m, :byte, 624, 16}, {19, :m, :kenji, 384, 10}, {19, :q, :numeric, 1063, 12}, {19, :q, :alphanumeric, 644, 11}, {19, :q, :byte, 442, 16}, {19, :q, :kenji, 272, 10}, {19, :h, :numeric, 813, 12}, {19, :h, :alphanumeric, 493, 11}, {19, :h, :byte, 338, 16}, {19, :h, :kenji, 208, 10}, {20, :l, :numeric, 2061, 12}, {20, :l, :alphanumeric, 1249, 11}, {20, :l, :byte, 858, 16}, {20, :l, :kenji, 528, 10}, {20, :m, :numeric, 1600, 12}, {20, :m, :alphanumeric, 970, 11}, {20, :m, :byte, 666, 16}, {20, :m, :kenji, 410, 10}, {20, :q, :numeric, 1159, 12}, {20, :q, :alphanumeric, 702, 11}, {20, :q, :byte, 482, 16}, {20, :q, :kenji, 297, 10}, {20, :h, :numeric, 919, 12}, {20, :h, :alphanumeric, 557, 11}, {20, :h, :byte, 382, 16}, {20, :h, :kenji, 235, 10}, {21, :l, :numeric, 2232, 12}, {21, :l, :alphanumeric, 1352, 11}, {21, :l, :byte, 929, 16}, {21, :l, :kenji, 572, 10}, {21, :m, :numeric, 1708, 12}, {21, :m, :alphanumeric, 1035, 11}, {21, :m, :byte, 711, 16}, {21, :m, :kenji, 438, 10}, {21, :q, :numeric, 1224, 12}, {21, :q, :alphanumeric, 742, 11}, {21, :q, :byte, 509, 16}, {21, :q, :kenji, 314, 10}, {21, :h, :numeric, 969, 12}, {21, :h, :alphanumeric, 587, 11}, {21, :h, :byte, 403, 16}, {21, :h, :kenji, 248, 10}, {22, :l, :numeric, 2409, 12}, {22, :l, :alphanumeric, 1460, 11}, {22, :l, :byte, 1003, 16}, {22, :l, :kenji, 618, 10}, {22, :m, :numeric, 1872, 12}, {22, :m, :alphanumeric, 1134, 11}, {22, :m, :byte, 779, 16}, {22, :m, :kenji, 480, 10}, {22, :q, :numeric, 1358, 12}, {22, :q, :alphanumeric, 823, 11}, {22, :q, :byte, 565, 16}, {22, :q, :kenji, 348, 10}, {22, :h, :numeric, 1056, 12}, {22, :h, :alphanumeric, 640, 11}, {22, :h, :byte, 439, 16}, {22, :h, :kenji, 270, 10}, {23, :l, :numeric, 2620, 12}, {23, :l, :alphanumeric, 1588, 11}, {23, :l, :byte, 1091, 16}, {23, :l, :kenji, 672, 10}, {23, :m, :numeric, 2059, 12}, {23, :m, :alphanumeric, 1248, 11}, {23, :m, :byte, 857, 16}, {23, :m, :kenji, 528, 10}, {23, :q, :numeric, 1468, 12}, {23, :q, :alphanumeric, 890, 11}, {23, :q, :byte, 611, 16}, {23, :q, :kenji, 376, 10}, {23, :h, :numeric, 1108, 12}, {23, :h, :alphanumeric, 672, 11}, {23, :h, :byte, 461, 16}, {23, :h, :kenji, 284, 10}, {24, :l, :numeric, 2812, 12}, {24, :l, :alphanumeric, 1704, 11}, {24, :l, :byte, 1171, 16}, {24, :l, :kenji, 721, 10}, {24, :m, :numeric, 2188, 12}, {24, :m, :alphanumeric, 1326, 11}, {24, :m, :byte, 911, 16}, {24, :m, :kenji, 561, 10}, {24, :q, :numeric, 1588, 12}, {24, :q, :alphanumeric, 963, 11}, {24, :q, :byte, 661, 16}, {24, :q, :kenji, 407, 10}, {24, :h, :numeric, 1228, 12}, {24, :h, :alphanumeric, 744, 11}, {24, :h, :byte, 511, 16}, {24, :h, :kenji, 315, 10}, {25, :l, :numeric, 3057, 12}, {25, :l, :alphanumeric, 1853, 11}, {25, :l, :byte, 1273, 16}, {25, :l, :kenji, 784, 10}, {25, :m, :numeric, 2395, 12}, {25, :m, :alphanumeric, 1451, 11}, {25, :m, :byte, 997, 16}, {25, :m, :kenji, 614, 10}, {25, :q, :numeric, 1718, 12}, {25, :q, :alphanumeric, 1041, 11}, {25, :q, :byte, 715, 16}, {25, :q, :kenji, 440, 10}, {25, :h, :numeric, 1286, 12}, {25, :h, :alphanumeric, 779, 11}, {25, :h, :byte, 535, 16}, {25, :h, :kenji, 330, 10}, {26, :l, :numeric, 3283, 12}, {26, :l, :alphanumeric, 1990, 11}, {26, :l, :byte, 1367, 16}, {26, :l, :kenji, 842, 10}, {26, :m, :numeric, 2544, 12}, {26, :m, :alphanumeric, 1542, 11}, {26, :m, :byte, 1059, 16}, {26, :m, :kenji, 652, 10}, {26, :q, :numeric, 1804, 12}, {26, :q, :alphanumeric, 1094, 11}, {26, :q, :byte, 751, 16}, {26, :q, :kenji, 462, 10}, {26, :h, :numeric, 1425, 12}, {26, :h, :alphanumeric, 864, 11}, {26, :h, :byte, 593, 16}, {26, :h, :kenji, 365, 10}, {27, :l, :numeric, 3517, 14}, {27, :l, :alphanumeric, 2132, 13}, {27, :l, :byte, 1465, 16}, {27, :l, :kenji, 902, 12}, {27, :m, :numeric, 2701, 14}, {27, :m, :alphanumeric, 1637, 13}, {27, :m, :byte, 1125, 16}, {27, :m, :kenji, 692, 12}, {27, :q, :numeric, 1933, 14}, {27, :q, :alphanumeric, 1172, 13}, {27, :q, :byte, 805, 16}, {27, :q, :kenji, 496, 12}, {27, :h, :numeric, 1501, 14}, {27, :h, :alphanumeric, 910, 13}, {27, :h, :byte, 625, 16}, {27, :h, :kenji, 385, 12}, {28, :l, :numeric, 3669, 14}, {28, :l, :alphanumeric, 2223, 13}, {28, :l, :byte, 1528, 16}, {28, :l, :kenji, 940, 12}, {28, :m, :numeric, 2857, 14}, {28, :m, :alphanumeric, 1732, 13}, {28, :m, :byte, 1190, 16}, {28, :m, :kenji, 732, 12}, {28, :q, :numeric, 2085, 14}, {28, :q, :alphanumeric, 1263, 13}, {28, :q, :byte, 868, 16}, {28, :q, :kenji, 534, 12}, {28, :h, :numeric, 1581, 14}, {28, :h, :alphanumeric, 958, 13}, {28, :h, :byte, 658, 16}, {28, :h, :kenji, 405, 12}, {29, :l, :numeric, 3909, 14}, {29, :l, :alphanumeric, 2369, 13}, {29, :l, :byte, 1628, 16}, {29, :l, :kenji, 1002, 12}, {29, :m, :numeric, 3035, 14}, {29, :m, :alphanumeric, 1839, 13}, {29, :m, :byte, 1264, 16}, {29, :m, :kenji, 778, 12}, {29, :q, :numeric, 2181, 14}, {29, :q, :alphanumeric, 1322, 13}, {29, :q, :byte, 908, 16}, {29, :q, :kenji, 559, 12}, {29, :h, :numeric, 1677, 14}, {29, :h, :alphanumeric, 1016, 13}, {29, :h, :byte, 698, 16}, {29, :h, :kenji, 430, 12}, {30, :l, :numeric, 4158, 14}, {30, :l, :alphanumeric, 2520, 13}, {30, :l, :byte, 1732, 16}, {30, :l, :kenji, 1066, 12}, {30, :m, :numeric, 3289, 14}, {30, :m, :alphanumeric, 1994, 13}, {30, :m, :byte, 1370, 16}, {30, :m, :kenji, 843, 12}, {30, :q, :numeric, 2358, 14}, {30, :q, :alphanumeric, 1429, 13}, {30, :q, :byte, 982, 16}, {30, :q, :kenji, 604, 12}, {30, :h, :numeric, 1782, 14}, {30, :h, :alphanumeric, 1080, 13}, {30, :h, :byte, 742, 16}, {30, :h, :kenji, 457, 12}, {31, :l, :numeric, 4417, 14}, {31, :l, :alphanumeric, 2677, 13}, {31, :l, :byte, 1840, 16}, {31, :l, :kenji, 1132, 12}, {31, :m, :numeric, 3486, 14}, {31, :m, :alphanumeric, 2113, 13}, {31, :m, :byte, 1452, 16}, {31, :m, :kenji, 894, 12}, {31, :q, :numeric, 2473, 14}, {31, :q, :alphanumeric, 1499, 13}, {31, :q, :byte, 1030, 16}, {31, :q, :kenji, 634, 12}, {31, :h, :numeric, 1897, 14}, {31, :h, :alphanumeric, 1150, 13}, {31, :h, :byte, 790, 16}, {31, :h, :kenji, 486, 12}, {32, :l, :numeric, 4686, 14}, {32, :l, :alphanumeric, 2840, 13}, {32, :l, :byte, 1952, 16}, {32, :l, :kenji, 1201, 12}, {32, :m, :numeric, 3693, 14}, {32, :m, :alphanumeric, 2238, 13}, {32, :m, :byte, 1538, 16}, {32, :m, :kenji, 947, 12}, {32, :q, :numeric, 2670, 14}, {32, :q, :alphanumeric, 1618, 13}, {32, :q, :byte, 1112, 16}, {32, :q, :kenji, 684, 12}, {32, :h, :numeric, 2022, 14}, {32, :h, :alphanumeric, 1226, 13}, {32, :h, :byte, 842, 16}, {32, :h, :kenji, 518, 12}, {33, :l, :numeric, 4965, 14}, {33, :l, :alphanumeric, 3009, 13}, {33, :l, :byte, 2068, 16}, {33, :l, :kenji, 1273, 12}, {33, :m, :numeric, 3909, 14}, {33, :m, :alphanumeric, 2369, 13}, {33, :m, :byte, 1628, 16}, {33, :m, :kenji, 1002, 12}, {33, :q, :numeric, 2805, 14}, {33, :q, :alphanumeric, 1700, 13}, {33, :q, :byte, 1168, 16}, {33, :q, :kenji, 719, 12}, {33, :h, :numeric, 2157, 14}, {33, :h, :alphanumeric, 1307, 13}, {33, :h, :byte, 898, 16}, {33, :h, :kenji, 553, 12}, {34, :l, :numeric, 5253, 14}, {34, :l, :alphanumeric, 3183, 13}, {34, :l, :byte, 2188, 16}, {34, :l, :kenji, 1347, 12}, {34, :m, :numeric, 4134, 14}, {34, :m, :alphanumeric, 2506, 13}, {34, :m, :byte, 1722, 16}, {34, :m, :kenji, 1060, 12}, {34, :q, :numeric, 2949, 14}, {34, :q, :alphanumeric, 1787, 13}, {34, :q, :byte, 1228, 16}, {34, :q, :kenji, 756, 12}, {34, :h, :numeric, 2301, 14}, {34, :h, :alphanumeric, 1394, 13}, {34, :h, :byte, 958, 16}, {34, :h, :kenji, 590, 12}, {35, :l, :numeric, 5529, 14}, {35, :l, :alphanumeric, 3351, 13}, {35, :l, :byte, 2303, 16}, {35, :l, :kenji, 1417, 12}, {35, :m, :numeric, 4343, 14}, {35, :m, :alphanumeric, 2632, 13}, {35, :m, :byte, 1809, 16}, {35, :m, :kenji, 1113, 12}, {35, :q, :numeric, 3081, 14}, {35, :q, :alphanumeric, 1867, 13}, {35, :q, :byte, 1283, 16}, {35, :q, :kenji, 790, 12}, {35, :h, :numeric, 2361, 14}, {35, :h, :alphanumeric, 1431, 13}, {35, :h, :byte, 983, 16}, {35, :h, :kenji, 605, 12}, {36, :l, :numeric, 5836, 14}, {36, :l, :alphanumeric, 3537, 13}, {36, :l, :byte, 2431, 16}, {36, :l, :kenji, 1496, 12}, {36, :m, :numeric, 4588, 14}, {36, :m, :alphanumeric, 2780, 13}, {36, :m, :byte, 1911, 16}, {36, :m, :kenji, 1176, 12}, {36, :q, :numeric, 3244, 14}, {36, :q, :alphanumeric, 1966, 13}, {36, :q, :byte, 1351, 16}, {36, :q, :kenji, 832, 12}, {36, :h, :numeric, 2524, 14}, {36, :h, :alphanumeric, 1530, 13}, {36, :h, :byte, 1051, 16}, {36, :h, :kenji, 647, 12}, {37, :l, :numeric, 6153, 14}, {37, :l, :alphanumeric, 3729, 13}, {37, :l, :byte, 2563, 16}, {37, :l, :kenji, 1577, 12}, {37, :m, :numeric, 4775, 14}, {37, :m, :alphanumeric, 2894, 13}, {37, :m, :byte, 1989, 16}, {37, :m, :kenji, 1224, 12}, {37, :q, :numeric, 3417, 14}, {37, :q, :alphanumeric, 2071, 13}, {37, :q, :byte, 1423, 16}, {37, :q, :kenji, 876, 12}, {37, :h, :numeric, 2625, 14}, {37, :h, :alphanumeric, 1591, 13}, {37, :h, :byte, 1093, 16}, {37, :h, :kenji, 673, 12}, {38, :l, :numeric, 6479, 14}, {38, :l, :alphanumeric, 3927, 13}, {38, :l, :byte, 2699, 16}, {38, :l, :kenji, 1661, 12}, {38, :m, :numeric, 5039, 14}, {38, :m, :alphanumeric, 3054, 13}, {38, :m, :byte, 2099, 16}, {38, :m, :kenji, 1292, 12}, {38, :q, :numeric, 3599, 14}, {38, :q, :alphanumeric, 2181, 13}, {38, :q, :byte, 1499, 16}, {38, :q, :kenji, 923, 12}, {38, :h, :numeric, 2735, 14}, {38, :h, :alphanumeric, 1658, 13}, {38, :h, :byte, 1139, 16}, {38, :h, :kenji, 701, 12}, {39, :l, :numeric, 6743, 14}, {39, :l, :alphanumeric, 4087, 13}, {39, :l, :byte, 2809, 16}, {39, :l, :kenji, 1729, 12}, {39, :m, :numeric, 5313, 14}, {39, :m, :alphanumeric, 3220, 13}, {39, :m, :byte, 2213, 16}, {39, :m, :kenji, 1362, 12}, {39, :q, :numeric, 3791, 14}, {39, :q, :alphanumeric, 2298, 13}, {39, :q, :byte, 1579, 16}, {39, :q, :kenji, 972, 12}, {39, :h, :numeric, 2927, 14}, {39, :h, :alphanumeric, 1774, 13}, {39, :h, :byte, 1219, 16}, {39, :h, :kenji, 750, 12}, {40, :l, :numeric, 7089, 14}, {40, :l, :alphanumeric, 4296, 13}, {40, :l, :byte, 2953, 16}, {40, :l, :kenji, 1817, 12}, {40, :m, :numeric, 5596, 14}, {40, :m, :alphanumeric, 3391, 13}, {40, :m, :byte, 2331, 16}, {40, :m, :kenji, 1435, 12}, {40, :q, :numeric, 3993, 14}, {40, :q, :alphanumeric, 2420, 13}, {40, :q, :byte, 1663, 16}, {40, :q, :kenji, 1024, 12}, {40, :h, :numeric, 3057, 14}, {40, :h, :alphanumeric, 1852, 13}, {40, :h, :byte, 1273, 16}, {40, :h, :kenji, 784, 12} ] @ec_levels @table |> Enum.map(&elem(&1, 1)) |> Enum.uniq() @modes @table |> Enum.map(&elem(&1, 2)) |> Enum.uniq() @spec find_version(non_neg_integer(), error_correction_level(), mode()) :: {:error, :no_version_found} | {:ok, version()} def find_version(bin_len, ec_level \\ :h, mode \\ :byte) for ec_level <- @ec_levels, mode <- @modes, {version, _, _, cap, _} <- Enum.filter(@table, &match?({_, ^ec_level, ^mode, _, _}, &1)) |> Enum.sort_by(&elem(&1, 3)) do def find_version(bin_len, unquote(ec_level), unquote(mode)) when bin_len <= unquote(cap), do: {:ok, unquote(version)} end def find_version(_bin_len, _ec_level, _mode), do: {:error, :no_version_found} @spec character_count_indicator_bits(version(), error_correction_level(), mode()) :: non_neg_integer() def character_count_indicator_bits(version, ec_level, mode \\ :byte) for {version, ec_level, mode, _, cci_len} <- @table do def character_count_indicator_bits(unquote(version), unquote(ec_level), unquote(mode)), do: unquote(cci_len) end def character_count_indicator_bits(_version, _ec_level, _mode), do: 0 # {:version, :error_correction_level, :ec_codewords_per_block, :group1_block_len, :group1_codewords_per_block, :group2_block_len, :group2_codewords_per_block} @error_correction_table [ {1, :l, 7, 1, 19, 0, 0}, {1, :m, 10, 1, 16, 0, 0}, {1, :q, 13, 1, 13, 0, 0}, {1, :h, 17, 1, 9, 0, 0}, {2, :l, 10, 1, 34, 0, 0}, {2, :m, 16, 1, 28, 0, 0}, {2, :q, 22, 1, 22, 0, 0}, {2, :h, 28, 1, 16, 0, 0}, {3, :l, 15, 1, 55, 0, 0}, {3, :m, 26, 1, 44, 0, 0}, {3, :q, 18, 2, 17, 0, 0}, {3, :h, 22, 2, 13, 0, 0}, {4, :l, 20, 1, 80, 0, 0}, {4, :m, 18, 2, 32, 0, 0}, {4, :q, 26, 2, 24, 0, 0}, {4, :h, 16, 4, 9, 0, 0}, {5, :l, 26, 1, 108, 0, 0}, {5, :m, 24, 2, 43, 0, 0}, {5, :q, 18, 2, 15, 2, 16}, {5, :h, 22, 2, 11, 2, 12}, {6, :l, 18, 2, 68, 0, 0}, {6, :m, 16, 4, 27, 0, 0}, {6, :q, 24, 4, 19, 0, 0}, {6, :h, 28, 4, 15, 0, 0}, {7, :l, 20, 2, 78, 0, 0}, {7, :m, 18, 4, 31, 0, 0}, {7, :q, 18, 2, 14, 4, 15}, {7, :h, 26, 4, 13, 1, 14}, {8, :l, 24, 2, 97, 0, 0}, {8, :m, 22, 2, 38, 2, 39}, {8, :q, 22, 4, 18, 2, 19}, {8, :h, 26, 4, 14, 2, 15}, {9, :l, 30, 2, 116, 0, 0}, {9, :m, 22, 3, 36, 2, 37}, {9, :q, 20, 4, 16, 4, 17}, {9, :h, 24, 4, 12, 4, 13}, {10, :l, 18, 2, 68, 2, 69}, {10, :m, 26, 4, 43, 1, 44}, {10, :q, 24, 6, 19, 2, 20}, {10, :h, 28, 6, 15, 2, 16}, {11, :l, 20, 4, 81, 0, 0}, {11, :m, 30, 1, 50, 4, 51}, {11, :q, 28, 4, 22, 4, 23}, {11, :h, 24, 3, 12, 8, 13}, {12, :l, 24, 2, 92, 2, 93}, {12, :m, 22, 6, 36, 2, 37}, {12, :q, 26, 4, 20, 6, 21}, {12, :h, 28, 7, 14, 4, 15}, {13, :l, 26, 4, 107, 0, 0}, {13, :m, 22, 8, 37, 1, 38}, {13, :q, 24, 8, 20, 4, 21}, {13, :h, 22, 12, 11, 4, 12}, {14, :l, 30, 3, 115, 1, 116}, {14, :m, 24, 4, 40, 5, 41}, {14, :q, 20, 11, 16, 5, 17}, {14, :h, 24, 11, 12, 5, 13}, {15, :l, 22, 5, 87, 1, 88}, {15, :m, 24, 5, 41, 5, 42}, {15, :q, 30, 5, 24, 7, 25}, {15, :h, 24, 11, 12, 7, 13}, {16, :l, 24, 5, 98, 1, 99}, {16, :m, 28, 7, 45, 3, 46}, {16, :q, 24, 15, 19, 2, 20}, {16, :h, 30, 3, 15, 13, 16}, {17, :l, 28, 1, 107, 5, 108}, {17, :m, 28, 10, 46, 1, 47}, {17, :q, 28, 1, 22, 15, 23}, {17, :h, 28, 2, 14, 17, 15}, {18, :l, 30, 5, 120, 1, 121}, {18, :m, 26, 9, 43, 4, 44}, {18, :q, 28, 17, 22, 1, 23}, {18, :h, 28, 2, 14, 19, 15}, {19, :l, 28, 3, 113, 4, 114}, {19, :m, 26, 3, 44, 11, 45}, {19, :q, 26, 17, 21, 4, 22}, {19, :h, 26, 9, 13, 16, 14}, {20, :l, 28, 3, 107, 5, 108}, {20, :m, 26, 3, 41, 13, 42}, {20, :q, 30, 15, 24, 5, 25}, {20, :h, 28, 15, 15, 10, 16}, {21, :l, 28, 4, 116, 4, 117}, {21, :m, 26, 17, 42, 0, 0}, {21, :q, 28, 17, 22, 6, 23}, {21, :h, 30, 19, 16, 6, 17}, {22, :l, 28, 2, 111, 7, 112}, {22, :m, 28, 17, 46, 0, 0}, {22, :q, 30, 7, 24, 16, 25}, {22, :h, 24, 34, 13, 0, 0}, {23, :l, 30, 4, 121, 5, 122}, {23, :m, 28, 4, 47, 14, 48}, {23, :q, 30, 11, 24, 14, 25}, {23, :h, 30, 16, 15, 14, 16}, {24, :l, 30, 6, 117, 4, 118}, {24, :m, 28, 6, 45, 14, 46}, {24, :q, 30, 11, 24, 16, 25}, {24, :h, 30, 30, 16, 2, 17}, {25, :l, 26, 8, 106, 4, 107}, {25, :m, 28, 8, 47, 13, 48}, {25, :q, 30, 7, 24, 22, 25}, {25, :h, 30, 22, 15, 13, 16}, {26, :l, 28, 10, 114, 2, 115}, {26, :m, 28, 19, 46, 4, 47}, {26, :q, 28, 28, 22, 6, 23}, {26, :h, 30, 33, 16, 4, 17}, {27, :l, 30, 8, 122, 4, 123}, {27, :m, 28, 22, 45, 3, 46}, {27, :q, 30, 8, 23, 26, 24}, {27, :h, 30, 12, 15, 28, 16}, {28, :l, 30, 3, 117, 10, 118}, {28, :m, 28, 3, 45, 23, 46}, {28, :q, 30, 4, 24, 31, 25}, {28, :h, 30, 11, 15, 31, 16}, {29, :l, 30, 7, 116, 7, 117}, {29, :m, 28, 21, 45, 7, 46}, {29, :q, 30, 1, 23, 37, 24}, {29, :h, 30, 19, 15, 26, 16}, {30, :l, 30, 5, 115, 10, 116}, {30, :m, 28, 19, 47, 10, 48}, {30, :q, 30, 15, 24, 25, 25}, {30, :h, 30, 23, 15, 25, 16}, {31, :l, 30, 13, 115, 3, 116}, {31, :m, 28, 2, 46, 29, 47}, {31, :q, 30, 42, 24, 1, 25}, {31, :h, 30, 23, 15, 28, 16}, {32, :l, 30, 17, 115, 0, 0}, {32, :m, 28, 10, 46, 23, 47}, {32, :q, 30, 10, 24, 35, 25}, {32, :h, 30, 19, 15, 35, 16}, {33, :l, 30, 17, 115, 1, 116}, {33, :m, 28, 14, 46, 21, 47}, {33, :q, 30, 29, 24, 19, 25}, {33, :h, 30, 11, 15, 46, 16}, {34, :l, 30, 13, 115, 6, 116}, {34, :m, 28, 14, 46, 23, 47}, {34, :q, 30, 44, 24, 7, 25}, {34, :h, 30, 59, 16, 1, 17}, {35, :l, 30, 12, 121, 7, 122}, {35, :m, 28, 12, 47, 26, 48}, {35, :q, 30, 39, 24, 14, 25}, {35, :h, 30, 22, 15, 41, 16}, {36, :l, 30, 6, 121, 14, 122}, {36, :m, 28, 6, 47, 34, 48}, {36, :q, 30, 46, 24, 10, 25}, {36, :h, 30, 2, 15, 64, 16}, {37, :l, 30, 17, 122, 4, 123}, {37, :m, 28, 29, 46, 14, 47}, {37, :q, 30, 49, 24, 10, 25}, {37, :h, 30, 24, 15, 46, 16}, {38, :l, 30, 4, 122, 18, 123}, {38, :m, 28, 13, 46, 32, 47}, {38, :q, 30, 48, 24, 14, 25}, {38, :h, 30, 42, 15, 32, 16}, {39, :l, 30, 20, 117, 4, 118}, {39, :m, 28, 40, 47, 7, 48}, {39, :q, 30, 43, 24, 22, 25}, {39, :h, 30, 10, 15, 67, 16}, {40, :l, 30, 19, 118, 6, 119}, {40, :m, 28, 18, 47, 31, 48}, {40, :q, 30, 34, 24, 34, 25}, {40, :h, 30, 20, 15, 61, 16} ] @spec code_words_len(version(), error_correction_level()) :: non_neg_integer() def code_words_len(version, error_correction_level) for {version, error_correction_level, _, g1_blocks, g1_codewords, g2_blocks, g2_codewords} <- @error_correction_table do def code_words_len(unquote(version), unquote(error_correction_level)), do: unquote(g1_blocks * g1_codewords + g2_blocks * g2_codewords) end def code_words_len(_version, _error_correction_level), do: 0 @spec ec_codewords_per_block(version(), error_correction_level()) :: non_neg_integer() def ec_codewords_per_block(version, error_correction_level) for {version, error_correction_level, ec_codewords_per_block, _, _, _, _} <- @error_correction_table do def ec_codewords_per_block(unquote(version), unquote(error_correction_level)), do: unquote(ec_codewords_per_block) end def ec_codewords_per_block(_version, _error_correction_level), do: 0 @spec group1_block_len(version(), error_correction_level()) :: non_neg_integer() def group1_block_len(version, error_correction_level) for {version, error_correction_level, _, group1_block_len, _, _, _} <- @error_correction_table do def group1_block_len(unquote(version), unquote(error_correction_level)), do: unquote(group1_block_len) end def group1_block_len(_version, _error_correction_level), do: 0 @spec group1_codewords_per_block(version(), error_correction_level()) :: non_neg_integer() def group1_codewords_per_block(version, error_correction_level) for {version, error_correction_level, _, _, group1_codewords_per_block, _, _} <- @error_correction_table do def group1_codewords_per_block(unquote(version), unquote(error_correction_level)), do: unquote(group1_codewords_per_block) end def group1_codewords_per_block(_version, _error_correction_level), do: 0 @spec group2_block_len(version(), error_correction_level()) :: non_neg_integer() def group2_block_len(version, error_correction_level) for {version, error_correction_level, _, _, _, group2_block_len, _} <- @error_correction_table do def group2_block_len(unquote(version), unquote(error_correction_level)), do: unquote(group2_block_len) end def group2_block_len(_version, _error_correction_level), do: 0 @spec group2_codewords_per_block(version(), error_correction_level()) :: non_neg_integer() def group2_codewords_per_block(version, error_correction_level) for {version, error_correction_level, _, _, _, _, group2_codewords_per_block} <- @error_correction_table do def group2_codewords_per_block(unquote(version), unquote(error_correction_level)), do: unquote(group2_codewords_per_block) end def group2_codewords_per_block(_version, _error_correction_level), do: 0 # {:version, :remainer} @remainer [ {1, 0}, {2, 7}, {3, 7}, {4, 7}, {5, 7}, {6, 7}, {7, 0}, {8, 0}, {9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 3}, {15, 3}, {16, 3}, {17, 3}, {18, 3}, {19, 3}, {20, 3}, {21, 4}, {22, 4}, {23, 4}, {24, 4}, {25, 4}, {26, 4}, {27, 4}, {28, 3}, {29, 3}, {30, 3}, {31, 3}, {32, 3}, {33, 3}, {34, 3}, {35, 0}, {36, 0}, {37, 0}, {38, 0}, {39, 0}, {40, 0} ] @spec remainer(any) :: 0..7 def remainer(_version) for {version, remainer} <- @remainer do def remainer(unquote(version)), do: unquote(remainer) end def remainer(_version), do: 0end