Added Encoder data bytes padding

This commit is contained in:
Dmitriy Shishkov 2021-12-11 23:50:42 +03:00
parent 82b2908231
commit 77baa030c9
3 changed files with 30 additions and 6 deletions

View File

@ -20,11 +20,13 @@ BitArray Encoder::encode()
else if (metadata_bit_num + encoded_bit_num >= Tables::max_capability.at(corr_lvl).at(version)) 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"); 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); write_metadata(input.size(), metadata_bit_num - 4, method, e);
encode_input(metadata_bit_num); encode_input(metadata_bit_num);
pad_data(e, metadata_bit_num + encoded_bit_num);
return e; 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."); 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() unsigned char Encoder::get_version()
{ {
if (version < 0) throw std::runtime_error("Determite version before getting it"); if (version < 0) throw std::runtime_error("Determite version before getting it");

View File

@ -42,6 +42,8 @@ public:
static unsigned char encode_char(char ch); static unsigned char encode_char(char ch);
static void pad_data(BitArray& arr, unsigned bits_written);
unsigned char get_version(); unsigned char get_version();
BitArray get_data(); BitArray get_data();

View File

@ -90,16 +90,27 @@ TEST(EncoderTests, EncodesBytes) {
EXPECT_EQ(std::string(tmp), "0000110100001001010011010000101111001101000010111000110100011000001011010001100000001101000010111000110100001011100100100000110100001010100011010000101110001101000110001000110100001011101011010000101111101101000010110010"); 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) { TEST(EncoderTests, EncodesInput) {
Encoder e1("8675309", CorrectionLevel::M, QRCodeMethod::Numeric); Encoder e1("8675309", CorrectionLevel::Q, QRCodeMethod::Numeric);
e1.encode(); 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); Encoder e2("HELLO WORLD", CorrectionLevel::M, QRCodeMethod::Alphabetic);
e2.encode(); 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(); e3.encode();
EXPECT_EQ(std::string(e3.get_data()), "010000011011110100001001010011010000101111001101000010111000110100011000001011010001100000001101000010111000110100001011100100100000110100001010100011010000101110001101000110001000110100001011101011010000101111101101000010110010"); EXPECT_EQ(std::string(e3.get_data()), "01000001101111010000100101001101000010111100110100001011100011010001100000101101000110000000110100001011100011010000101110010010000011010000101010001101000010111000110100011000100011010000101110101101000010111110110100001011001000001110110000010001111011000001000111101100");
} }