2015-07-04 36 views
1

我正在將數據從C++客戶端傳輸到nodejs服務器。C++中的URL編碼和nodejs中的解碼

我使用zlib首先壓縮字符串deflate,然後使用curl_easy_escape對url進行壓縮字符串編碼。

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

當我運行它,我得到的輸出:

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"; 

然後我把它用發送

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 

這裏有什麼問題嗎?我如何調試它?

回答

1

您可以通過在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中爲2個字節。指定在node.js中構建緩衝區時,編碼可以解決問題,如果這是它:

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

https://nodejs.org/api/buffer.html#buffer_new_buffer_str_encoding

由於數據是zlib的壓縮這裏,或在一般情況下,壓縮,編碼應是binary

+0

我不知道我是否應該接受你的回答,因爲: 1.是的,問題是由於編碼。 2.但它不應該是utf8,因爲任何壓縮數據都是二進制的。 所以,是的,編碼中的「二進制」解決了這個問題。 –

+0

好的,我編輯了你的答案。謝謝。 –

+0

如果你發現這個問題很有見地,請你注意它嗎? –