2013-10-01 47 views
3

我想base64在NodeJS和python中編碼一個二進制字符串,我得到2個不同的值。base64在NodeJS和Python中編碼二進制字符串

注意該值i是使用os.urandom(16)

的NodeJS

> var i = '>e\x93\x10\xabK\xbe\xfeX\x97\x9a$\r\xef\x8f3'; 
> var s = new Buffer(i).toString('base64'); 
> console.log(s); 
PmXCkxDCq0vCvsO+WMKXwpokDcOvwo8z 

的Python

>>> import base64 
>>> i = '>e\x93\x10\xabK\xbe\xfeX\x97\x9a$\r\xef\x8f3' 
>>> s = base64.b64encode(i) 
>>> print s 
PmWTEKtLvv5Yl5okDe+PMw== 

我做得不對Python中產生16個隨機字節?它適用於常規字符串,例如我的名字。

的NodeJS

> var s = new Buffer('travis').toString('base64'); 
undefined 
> console.log(s); 
dHJhdmlz 

的Python

>>> s = base64.b64encode('travis') 
>>> print s 
dHJhdmlz 

回答

8

被的NodeJS編碼串的UTF-8表示。 Python正在編碼字節字符串。

在Python中,你必須做的:

>>> i = u'>e\x93\x10\xabK\xbe\xfeX\x97\x9a$\r\xef\x8f3' 
>>> i.encode('utf8').encode('base64') 
'PmXCkxDCq0vCvsO+WMKXwpokDcOvwo8z\n' 

得到相同的輸出。

您使用默認編碼創建了緩衝區,這意味着它會將i解釋爲以UTF-8開頭。您需要告訴Bufferi視爲二進制代替:

> var i = '>e\x93\x10\xabK\xbe\xfeX\x97\x9a$\r\xef\x8f3'; 
> var s = new Buffer(i, 'binary').toString('base64'); 
> s 
'PmWTEKtLvv5Yl5okDe+PMw==' 
+0

謝謝!看起來我正在經歷這種情況,因爲我對測試的價值進行了硬編碼。但生成它正常工作。 – tbeauvais

相關問題