2015-07-03 48 views
0

我使用了zlib壓縮來返回一個字符串。 https://panthema.net/2007/0328-ZLibString.html編碼和解碼字符串的區別

然後我做:被限定如

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 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構造函數需要一個以空字符結尾的字符串,因此它將數據截斷爲它找到的第一個0字節(它在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中解碼此字符串,我應該使用哪個函數? –