2015-07-03 2 views
0

Я использовал сжатие zlib для возврата строки.Разница в закодированной и декодированной строке

void StatsClientImpl::sendToServer(std::stringstream &sstr) // to include an update interval version 
{ 
    std::string error_msg = ""; 
    std::stringstream temp(AppState::getPid() + "," + AppState::getInstallOS()); 
    temp << sstr.str(); 
    std::string s = zlib_compress(temp.str()); 
....... 

zlib_compress был, как определено в: https://panthema.net/2007/0328-ZLibString.html

Тогда я сделал: std::cout << s.size() <<"\n";

было показано Размер строки, чтобы быть 18.

Тогда я сделал:

CURL *handle = curl_easy_init(); 
char* o = curl_easy_escape(handle, s.data(), s.size()); 
     std::string bin(o); 
     std::cout << o <<"\n"; 
     char* i= curl_easy_unescape(handle, bin.data(), bin.size(), NULL); 
     std::string in(i); 
     std::cout << i << in.size() <<"\n"; 

Это дало мне следующий результат:

x%DA%D3%D1%81%80%E2%92%D2%B44%1D%03%00%1BW%03%E5 
x??с??Ҵ413 
x%DA%D3%D1%81%80%E2%92%D2%B44%1D%03 

Я проходил это в качестве входной строки:

,,,,,,stuff,0 

Почему существует разница в декодированных и закодированных строк? Как это исправить?

ответ

1
std::string in(i); 

Проблема здесь; этот конструктор std::string ожидает строку с завершающим нулем, поэтому он обрезает данные до первого найденного байта (который находится на ранней стадии вывода gzip). Вы хотите попросить curl_easy_unescape как долго неэкранированный данные и построить in соответственно:

int sz=0; 
    char* i= curl_easy_unescape(handle, bin.data(), bin.size(), &sz); 
    std::string in(i, i+sz); 

Но у меня есть question.Why не это произойдет в bin(o)?

Потому что o указывает на строку с кодировкой URL, которая не включает в себя нулевые байты, кроме терминатора.

+0

Спаситель! :) Мне просто нужно запустить некоторые тесты на моей стороне сервера, тогда я приму свой ответ! –

+0

Но у меня вопрос. Почему это не происходит в 'bin (o)'? –

+0

Кроме того, если я пытаюсь декодировать эту строку в javascript, какую функцию я должен использовать? –

Смежные вопросы