Кодировка длины строки - но очень странным образом!
encoding += to_string(count) + str[i];
Давайте закодируем строку "sssssssssss"
;это приведет к строке с представлением массива
{ '1', '1', 's', 0 } // string "11s"
(я выбрал это представление сознательно, вы увидите позже ...)
Проблема в том, что вы не будетевозможность кодировать строки, содержащие цифры: "1s"
приведет к
{ '1', '1', '1', 's', 0 } // string "111s"
, но как бы вы хотели различить, если нам нужно декодировать обратно до "1s"
или в строку, содержащую только 111 s
символов?
Попробуйте по-другому: символ на самом деле тоже не более чем число, например, буква s
представлена числовым значением 115 (как минимум в ASCII и совместимом), цифрой 7
(как символ!) числовым значением 55. Таким образом, вы можете просто добавить значение в виде символа:
encoding += static_cast<unsigned char>(count) + str[i];
В некоторых угловых случаях беззнаковый символ не может содержать числа больше 255, поэтому строка, имеющая несколько последующихравные символы должны быть закодированы, например, как
{ 255, 's', 7, 's', 0 } // 262 times letter s
Обратите внимание на представление;255 и 7 даже не печатные символы!Теперь давайте предположим, что мы закодировали строку с 115-кратной буквой s:
{ 115, 's', 0 } // guess, as string, this would be "ss"...
Чтобы поймать, вы просто бы явно проверили свой счетчик на предмет достижения максимального значения.
Теперь декодирование становится намного проще:
size_t i = 0;
while(i < encoded.size())
{
unsigned char n = encoded[i];
++i;
while(n--)
decoded += encoded[i];
++i;
}
Абсолютно просто: первый байт всегда как число, второй - как символ ...
Если вы настаиваете на кодировании чисел в виде строки (и кодировании только строк, не содержащих цифр),Вы можете использовать std::istringstream
:
std::istringstream s(encoded);
unsigned int n;
char c;
while(s >> n >> c)
{
while(n--)
decoded += encoded[i];
}
OK, это не симметрично вашей функции кодирования.Вы могли бы приспособить последний, чтобы быть таким, хотя:
std::ostringstream s;
for(;;) // ...
{
unsigned int count = 1;
// ...
s << count << str[i];
}