2013-10-01 2 views
3

Я пытаюсь base64 кодировать двоичную строку в NodeJS и python, и я получаю 2 разных значения.base64 кодирует двоичную строку в NodeJS и Python

Обратите внимание, что значение i 16 случайных байт, сгенерированные в питона, используя 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== 

Я делаю что-то не так? Он работает для обычной строки, такой как мое имя.

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 для начала. Вы должны сообщить Buffer для обработки i вместо двоичного кода:

> 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

Спасибо! Кажется, я испытывал это, потому что я жестко кодировал значение i для тестирования. Но генерация его правильно работает. – tbeauvais

Смежные вопросы