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
。