8

NodeJS と python でバイナリ文字列を base64 エンコードしようとしていますが、2 つの異なる値を取得しています。

i値は、Python で生成された 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

パイソン

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

パイソン

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

1 に答える 1

12

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=='
于 2013-10-01T20:29:31.397 に答える