[英]URL encoding in C++ and decoding in nodejs
我正在將數據從C ++客戶端傳輸到nodejs服務器。
我先使用zlib deflate壓縮字符串,然后使用curl_easy_escape對所壓縮的字符串進行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服務器上收到第二個編碼的字符串。 我現在嘗試對其進行解碼。
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
這里有什么問題? 我該如何調試?
您可以通過在C ++和node.js代碼中為壓縮字符串中的每個字節打印十進制值來調試它。 對於C ++,該代碼為:
for(int i=0; i<s.size(); i++) {
std::cout << static_cast<int>(s[i]);
}
在node.js代碼中,您需要為變量buffer
包含的每個字節打印十進制值。
如果C ++和node.js部分中每個字節的十進制值都相同,則zlib
庫不兼容或函數不匹配:例如,C ++中的zlib_compress
可能與node.js中的zlib.inflate
對應:類似zlib.decompress()
的函數。
根本原因可能是C ++ std::string
中的字符為1個字節,而node.js中的std::string
2個字節。 如果是的話,在node.js中構造Buffer時指定編碼可以解決問題:
var buffer = new Buffer(x, 'binary');
請參閱https://nodejs.org/api/buffer.html#buffer_new_buffer_str_encoding
由於此處是zlib壓縮數據,或者在一般壓縮情況下,編碼應為binary
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.