37 {0, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28,
38 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},
39 {0, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26,
40 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28},
41 {0, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30,
42 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},
43 {0, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28,
44 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},
50 {0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8,
51 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25},
52 {0, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16,
53 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49},
54 {0, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20,
55 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68},
56 {0, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25,
57 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81},
91 {6, 26, 50, 74, 98, 122},
92 {6, 30, 54, 78, 102, 126},
93 {6, 26, 52, 78, 104, 130},
94 {6, 30, 56, 82, 108, 134},
95 {6, 34, 60, 86, 112, 138},
96 {6, 30, 58, 86, 114, 142},
97 {6, 34, 62, 90, 118, 146},
98 {6, 30, 54, 78, 102, 126, 150},
99 {6, 24, 50, 76, 102, 128, 154},
100 {6, 28, 54, 80, 106, 132, 158},
101 {6, 32, 58, 84, 110, 136, 162},
102 {6, 26, 54, 82, 110, 138, 166},
103 {6, 30, 58, 86, 114, 142, 170},
364 const size_t triplets = len / 3;
365 const size_t triplets_size = triplets * 3;
366 const size_t rem = len % 3;
367 const size_t rem_bits = rem == 2 ? 7 : rem == 1 ? 4 : 0;
368 const size_t total_size = 10 * triplets + rem_bits;
370 if (pos + total_size > n_bits)
return false;
374 for (
size_t i = 0; i < triplets_size; i += 3) {
376 buf[1] = data[i + 1];
377 buf[2] = data[i + 2];
384 buf[0] = data[triplets_size];
385 buf[1] = data[triplets_size + 1];
392 if (pos + 11 * (
int(len & ~1ul) / 2) > n_bits)
return false;
394 for (
int i = 0; i < int(len & ~1ul); i += 2) {
399 if (pos + 6 > n_bits)
return false;
403 }
else if (mode ==
M_BYTE) {
404 if (pos + len * 8 > n_bits)
return false;
406 for (
size_t i = 0; i < len; ++i)
add_bits(data[i], 8, out, pos);
408 if (pos + 13 * (len / 2) > n_bits)
return false;
410 for (
size_t i = 0; i < len; i += 2) {
411 uint16_t val = ((uint8_t) data[i]) | (((uint8_t) data[i + 1]) << 8);
413 val -= val < 0x9FFC ? 0x8140 : 0xC140;
415 res += (val >> 8) * 0xc0;
420 size_t padding = n_bits - pos;
423 add_bits(0, padding > 4 ? 4 : padding, out, pos);
425 if (pos & 7)
add_bits(0, (8 - pos) & 7, out, pos);
427 while (pos < n_bits)
add_bits(++i & 1 ? 0xec : 0x11, 8, out, pos);