From: Skullheadx Date: Sun, 17 Nov 2024 22:51:30 +0000 (-0500) Subject: format info with error correction X-Git-Url: http://git.skullheadx.com/nixos/README?a=commitdiff_plain;h=99f55d49920c5009c9112985fdc4689016557c16;p=qrcodescanner.git format info with error correction --- diff --git a/qrgenerator.cpp b/qrgenerator.cpp index bb3c113..453a86c 100644 --- a/qrgenerator.cpp +++ b/qrgenerator.cpp @@ -20,6 +20,7 @@ std::vector> symbol_placement_up_special(std::vector> symbol_placement_down_special(std::vector> grid, std::size_t x, std::size_t y, std::vector character); unsigned int evaluate_symbol(std::vector> grid); void print_grid(std::vector> grid); +std::vector calculate_remainder(const std::vector& data, const std::vector& generator); int main() { int k; @@ -462,7 +463,7 @@ int main() { //print_grid(mask_patterns[7]); - + /* std::vector> test_grid(21, std::vector (21, 0)); // top left finder pattern test_grid = set_square(test_grid, 0,0,7,1); @@ -493,15 +494,14 @@ int main() { for (std::size_t i{8}; i < 8+5; ++i){ test_grid[i][6] = (i+1) % 2; } - - print_grid(test_grid); + */ std::vector>> mask_pattern_results(8, std::vector>(21, std::vector (21, 1))); for (std::size_t ind{}; ind < 8; ++ind){ for (std::size_t i{}; i < 21; ++i){ for (std::size_t j{}; j < 21; ++j){ - mask_pattern_results[ind][i][j] = (mask_pattern_results[ind][i][j] && test_grid[i][j]); // CHANGE test_grid BACK TO grid for REAL USE + mask_pattern_results[ind][i][j] = (mask_pattern_results[ind][i][j] && grid[i][j]); // CHANGE test_grid BACK TO grid for REAL USE if (mask_patterns[ind][i][j]){ mask_pattern_results[ind][i][j] = !mask_pattern_results[ind][i][j]; } @@ -518,19 +518,60 @@ int main() { lowest_score = evaluate_symbol(mask_pattern_results[i]); } } - - std::cout << "best mask pattern: " << mask_pattern << std::endl; + std::bitset<3> mask_bitset{mask_pattern}; + std::vector mask_pattern_bits{mask_bitset[2], mask_bitset[1], mask_bitset[0]}; + //mask_pattern_bits = {1,0,1}; // REMOVE TESTinG PurposES ONLy + print_grid(mask_pattern_results[mask_pattern]); + std::cout << "best mask pattern: " << mask_pattern << std::endl; + for (auto i : mask_pattern_bits){std::cout << i;} std::cout << std::endl; + std::vector error_correction_level_bits = {0,0}; + + std::vector format_information{}; + format_information.insert(format_information.begin(), error_correction_level_bits.begin(), error_correction_level_bits.end()); + format_information.insert(format_information.begin() + 2, mask_pattern_bits.begin(), mask_pattern_bits.end()); + + std::cout << "Format information data bits: ";for (auto i : format_information){std::cout << i;} std::cout << std::endl; + + format_information.insert(format_information.end(), 10, 0); + // Generator polynomial: x^10 + x^8 + x^5 + x^4 + x^2 + x + 1 + std::vector bch_generator_polynomial = {1,0,1,0,0,1,1,0,1,1,1}; + std::vector bch_remainder = calculate_remainder(format_information, bch_generator_polynomial); + + std::cout << "Format information error correction bits: ";for (auto i :bch_remainder){std::cout << i;} std::cout << std::endl; + + format_information.resize(5); + std::vector format_information_message = format_information; + format_information_message.insert(format_information_message.end(), bch_remainder.begin(), bch_remainder.end()); + std::cout << "Format information all message bits: ";for (auto i : format_information_message){std::cout << i;} std::cout << std::endl; + std::vector format_info_mask = {1,0,1,0,1,0,0,0,0,0,1,0,0,1,0}; + std::cout << "Format information info mask: ";for (auto i : format_info_mask){std::cout << i;} std::cout << std::endl; + + for (std::size_t i{0}; i < 15; ++i){ + format_information_message[i] = format_information_message[i] ^ format_info_mask[i]; + } + std::cout << "error corrected format information: ";for (auto i : format_information_message){std::cout << i;} std::cout << std::endl; return 0; } - +std::vector calculate_remainder(const std::vector& data, const std::vector& generator) { + std::vector dividend = data; + for (size_t i = 0; i <= dividend.size() - generator.size(); ++i) { + if (dividend[i]) { + for (size_t j = 0; j < generator.size(); ++j) { + dividend[i + j] = dividend[i+j] ^ generator[j]; + } + } + } + std::vector remainder(dividend.end() - generator.size() + 1, dividend.end()); + return remainder; +} void print_grid(std::vector> grid){ for (std::size_t i{}; i < 21; ++i){