编码和解码字符串的区别
Difference in encoded and decoded string
我使用 zlib 压缩 return 一个字符串。
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);
But I have a question.Why doesn't this happen in bin(o)
?
因为o
指向一个URL编码的字符串,除了终止符外不包含空字节。
我使用 zlib 压缩 return 一个字符串。
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);
But I have a question.Why doesn't this happen in
bin(o)
?
因为o
指向一个URL编码的字符串,除了终止符外不包含空字节。