编码字符串和解码字符串的差异

Difference in encoded and decoded string

本文关键字:字符串 编码字符 编码 解码      更新时间:2023-10-16

我使用了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

为什么解码字符串和编码字符串有区别?我该如何解决这个问题?

    std::string in(i);

问题就在这里;这个std::string构造函数需要一个以null结尾的字符串,因此它将数据截断到它找到的第一个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);

但我有个问题。为什么bin(o)中没有发生这种情况?

因为o指向一个URL编码的字符串,除了终止符之外,它不包括空字节。