diff --git a/QRCodeLibrary/Encoder.cpp b/QRCodeLibrary/Encoder.cpp index 1386431..1b9d3d2 100644 --- a/QRCodeLibrary/Encoder.cpp +++ b/QRCodeLibrary/Encoder.cpp @@ -20,11 +20,13 @@ BitArray Encoder::encode() else if (metadata_bit_num + encoded_bit_num >= Tables::max_capability.at(corr_lvl).at(version)) throw std::invalid_argument("This version is too low for input of this size. Set negative version to calculate it dynamicly"); - e.resize(metadata_bit_num + encoded_bit_num); + e.resize(Tables::max_capability.at(corr_lvl).at(version)); write_metadata(input.size(), metadata_bit_num - 4, method, e); encode_input(metadata_bit_num); + pad_data(e, metadata_bit_num + encoded_bit_num); + return e; } @@ -127,6 +129,15 @@ unsigned char Encoder::encode_char(char ch) throw std::runtime_error("No such character in alphabet. Use bytes QR code method."); } +void Encoder::pad_data(BitArray& arr, unsigned bits_written) +{ + unsigned encoded_bytes = ceil_div(bits_written, 8); + unsigned max_capability_bytes = arr.size / 8; + + for (unsigned i = encoded_bytes; i < max_capability_bytes; i++) + arr.v[i] = ((i - encoded_bytes) % 2 == 0) ? 0b11101100 : 0b00010001; +} + unsigned char Encoder::get_version() { if (version < 0) throw std::runtime_error("Determite version before getting it"); diff --git a/QRCodeLibrary/Encoder.hpp b/QRCodeLibrary/Encoder.hpp index c2ed7dd..fca397a 100644 --- a/QRCodeLibrary/Encoder.hpp +++ b/QRCodeLibrary/Encoder.hpp @@ -42,6 +42,8 @@ public: static unsigned char encode_char(char ch); + static void pad_data(BitArray& arr, unsigned bits_written); + unsigned char get_version(); BitArray get_data(); diff --git a/tests/Encoder_test.cpp b/tests/Encoder_test.cpp index 552b767..24ab014 100644 --- a/tests/Encoder_test.cpp +++ b/tests/Encoder_test.cpp @@ -90,16 +90,27 @@ TEST(EncoderTests, EncodesBytes) { EXPECT_EQ(std::string(tmp), "0000110100001001010011010000101111001101000010111000110100011000001011010001100000001101000010111000110100001011100100100000110100001010100011010000101110001101000110001000110100001011101011010000101111101101000010110010"); } +TEST(EncoderTests, PadsData) { + BitArray arr(6*8); + arr.v[0] = 0b11001100; + arr.v[1] = 0b11111111; + arr.v[2] = 0b11000000; + + Encoder::pad_data(arr, 18); + + EXPECT_EQ(std::string(arr), "110011001111111111000000111011000001000111101100"); +} + TEST(EncoderTests, EncodesInput) { - Encoder e1("8675309", CorrectionLevel::M, QRCodeMethod::Numeric); + Encoder e1("8675309", CorrectionLevel::Q, QRCodeMethod::Numeric); e1.encode(); - EXPECT_EQ(std::string(e1.get_data()), "00010000000111110110001110000100101001"); + EXPECT_EQ(std::string(e1.get_data()), "00010000000111110110001110000100101001001110110000010001111011000001000111101100000100011110110000010001"); Encoder e2("HELLO WORLD", CorrectionLevel::M, QRCodeMethod::Alphabetic); e2.encode(); - EXPECT_EQ(std::string(e2.get_data()), "00100000010110110000101101111000110100010111001011011100010011010100001101"); + EXPECT_EQ(std::string(e2.get_data()), "00100000010110110000101101111000110100010111001011011100010011010100001101000000111011000001000111101100000100011110110000010001"); - Encoder e3(u8"Дмитрий Шишков", CorrectionLevel::M, QRCodeMethod::Byte); + Encoder e3(u8"Дмитрий Шишков", CorrectionLevel::Q, QRCodeMethod::Byte); e3.encode(); - EXPECT_EQ(std::string(e3.get_data()), "010000011011110100001001010011010000101111001101000010111000110100011000001011010001100000001101000010111000110100001011100100100000110100001010100011010000101110001101000110001000110100001011101011010000101111101101000010110010"); + EXPECT_EQ(std::string(e3.get_data()), "01000001101111010000100101001101000010111100110100001011100011010001100000101101000110000000110100001011100011010000101110010010000011010000101010001101000010111000110100011000100011010000101110101101000010111110110100001011001000001110110000010001111011000001000111101100"); } \ No newline at end of file