簡體   English   中英

C ++中的URL編碼和Node.js中的解碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM