From: Skullheadx Date: Thu, 21 Nov 2024 01:04:44 +0000 (-0500) Subject: decode bit stream into input data X-Git-Url: http://git.skullheadx.com/nixos/static/gitweb.css?a=commitdiff_plain;h=15a1fe96636e54e7f0f195d2c4a5b473f18204c6;p=qrcodescanner.git decode bit stream into input data --- diff --git a/camera.cpp b/camera.cpp index 8706735..26d2803 100644 --- a/camera.cpp +++ b/camera.cpp @@ -8,6 +8,7 @@ void print(std::vector> &symbol); void print_codewords(std::vector &vec); void vec_xor(std::vector &v1, const std::vector v2); unsigned int distance(std::vector &v1, const std::vector &v2); +unsigned int convert_uint(std::vector &vec); void read_words_from_file(char const *filename, std::vector> &symbol); void retrieve_codewords(std::vector> &symbol, std::vector &codewords, bool is_upwards, std::size_t row, std::size_t col); void retrieve_special_codewords(std::vector> &symbol, std::vector &codewords, bool is_upwards, int row, int col); @@ -15,6 +16,7 @@ void retrieve_special_codewords(std::vector> &symbol, std::vec std::vector get_format_info(std::vector> &symbol); void decode_mask(std::vector> &symbol, std::size_t mask_pattern); std::vector get_codewords_from_symbol(std::vector> &symbol); +std::string get_input_data(std::vector &input_data, unsigned int character_count_indicator); int main(){ std::vector> symbol(21, std::vector(21,0)); @@ -30,7 +32,7 @@ int main(){ mask_pattern[1] = format_info[3]; mask_pattern[2] = format_info[4]; decode_mask(symbol, mask_pattern.to_ulong()); - print(symbol); + //print(symbol); std::vector codewords = get_codewords_from_symbol(symbol); //print_codewords(codewords); @@ -42,13 +44,15 @@ int main(){ //print_codewords(data_codewords); std::vector mode_indicator(data_codewords.begin(), data_codewords.begin() + 4); std::vector character_count(data_codewords.begin() + 4, data_codewords.begin() + 14); - print(character_count); - - - + //print(character_count); + unsigned int character_count_indicator = convert_uint(character_count); + std::cout << character_count_indicator << std::endl; + std::vector input_data(data_codewords.begin() + 14, data_codewords.end()); + print(input_data); + std::cout << std::endl; + std::string value = get_input_data(input_data, character_count_indicator); + std::cout << value << std::endl; - - return 0; } @@ -97,7 +101,14 @@ unsigned int distance(std::vector &v1, const std::vector &v2){ } return dist; } - +unsigned int convert_uint(std::vector &vec){ + unsigned int result{0}; + for (unsigned int i{0}; i < vec.size(); ++i){ + result += std::pow(2,vec.size() - i - 1) * vec[i]; + } + return result; +} + std::vector get_format_info(std::vector> &symbol){ std::vector format_info(15,0); @@ -312,6 +323,25 @@ std::vector get_codewords_from_symbol(std::vector> &symb return codewords; } +std::string get_input_data(std::vector &input_data, unsigned int character_count_indicator){ + std::string data = ""; + unsigned int data_length = character_count_indicator / 3 * 10; + for (std::size_t i{0}; i < data_length; i += 10){ + std::vector subvec(input_data.begin() + i, input_data.begin() + i + 10); + data += std::to_string(convert_uint(subvec)); + } + if (character_count_indicator % 3 == 1){ + std::vector subvec(input_data.begin() + data_length, input_data.begin() + data_length + 4); + data += std::to_string(convert_uint(subvec)); + } + else if (character_count_indicator % 3 == 2){ + std::vector subvec(input_data.begin() + data_length, input_data.begin() + data_length + 7); + data += std::to_string(convert_uint(subvec)); + } + return data; +} + + void read_words_from_file(char const *filename, std::vector> &symbol) { std::ifstream file{ filename }; if (!file.is_open()) { diff --git a/qrgenerator.cpp b/qrgenerator.cpp index 8db949b..b97e37e 100644 --- a/qrgenerator.cpp +++ b/qrgenerator.cpp @@ -53,14 +53,12 @@ int main() { } } } - /* - k{0}; + k=0; for (auto i : input_data_vector){ if (k++ % 10== 0){std::cout << " ";} std::cout << i; } std::cout << std::endl; - */ // Convert character count indicator to binary (10 bits for version 1-H): std::bitset<10> character_count_indicator = input_length; //for (std::size_t i{0}; i < 10; ++i){std::cout << character_count_indicator[i];}std::cout<