C ++中的URL编码和nodejs中的解码

我正在将数据从C ++客户端传输到nodejs服务器。

我使用zlib首先压缩string,然后使用curl_easy_escape来对压缩的string进行url编码。

std::string s = zlib_compress(temp.str()); std::cout << s <<"\n"; CURL *handle = curl_easy_init(); char* o = curl_easy_escape(handle, s.data(), s.size()); std::cout << o <<"\n"; 

然后我发送它使用:

 std::string bin(o); curl_easy_setopt(handle, CURLOPT_POSTFIELDSIZE, bin.size()); curl_easy_setopt(handle, CURLOPT_POSTFIELDS, bin.data()); curl_easy_perform(handle); 

当我运行这个,我得到的输出:

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

现在,我收到了我的nodejs服务器上的第二个编码string。 我现在尝试解码它。

 var x = req.params; for (var key in req.body) { console.log(key); var x = unescape(key); var buffer = new Buffer(x); console.log(x); zlib.inflate(buffer, function(err, buffer) { console.log(err+" here"); }); } 

哪些产出:

 x%DA%D3%D1%81%80%E2%92%D2%B44%1D%03%00%1BW%03%E5 xÚÓÑâÒ´4å Error: incorrect header check here 

这里有什么问题? 我如何debugging它?

您可以通过在C ++和node.js代码中打印压缩string中的每个字节的十进制值来进行debugging。 对于C ++,代码将是:

 for(int i=0; i<s.size(); i++) { std::cout << static_cast<int>(s[i]); } 

在node.js代码中,您需要为variablesbuffer包含的每个字节打印十进制值。

如果每个字节的十进制值在C ++和node.js部分都是相同的,那么zlib库是不兼容的或函数不匹配:例如,C ++中的zlib_compress可能对应于node.js中的zlib.inflate以外的其他东西:也许存在像zlib.decompress()这样的函数。

根本原因可能在于,字符在C ++ std::string是1个字节,在node.js中是2个字节。 如果在node.js中构造Buffer时指定编码,则可以解决问题:

 var buffer = new Buffer(x, 'binary'); 

请参阅https://nodejs.org/api/buffer.html#buffer_new_buffer_str_encoding

由于这里的数据是zlib压缩的,或者在一般压缩的情况下,编码应该是binary