Декодирование base64 работает в узле иначе, чем в php, perl или python

Мне нужно декодировать токен base64 для строки аутентификации, и я нашел несколько рабочих примеров на Python, Perl и PHP, и я написал эквивалентный код на Node, но столкнулся с проблемой. Кажется, декодер base64 для Node работает не так, как для других 3 языков.

Запуск этого в Python

token = 'BaSe64sTRiNghERe'
decoded_token = token.decode('base64')
print decoded_token

возвращает эту строку

???F # `? D ^

Запуск этого в Perl

my $token = 'BaSe64sTRiNghERe';
my $decoded_token = decode_base64($token);
print $decoded_token;

возвращает эту строку

???F # `? D ^

Запуск этого в PHP

$token = 'BaSe64sTRiNghERe';
$decoded_token = base64_decode($token, true);
echo $decoded_token;

возвращает эту строку

???F # `? D ^

и, наконец, запустить это в сценарии Node

var token = 'BaSe64sTRiNghERe',
decoded_token = Buffer.from(token, 'base64').toString();
console.log(decoded_token);

возвращает эту строку

????F # `? D ^

Вопрос в том, почему дополнительный знак вопроса в декодированной строке? И как я могу получить тот же результат в Node, что и в Perl, Python и PHP?

ОБНОВИТЬ

запустить это в командной строке

echo BaSe64sTRiNghERe | base64 --decode

дает мне тот же вывод, что и сценарии Perl, Python и PHP

но запустить ту же команду с узла

var exec = require('child_process').exec;
exec('echo BaSe64sTRiNghERe | base64 --decode', function callback(error, stdout, stderr){
console.log(stdout);
});

Я все еще получаю неправильные вещи.

1

Решение

Вывод отличается, так как вы сгенерировали непечатаемые символы, и кажется, что узел обрабатывает эти непечатные символы иначе, чем в других языках. Вы также теряете информацию:

>>> token = 'BaSe64sTRiNghERe'
>>> decoded_token = token.decode('base64')
>>> print decoded_token
???F#`?D^
>>> decoded_token[0] == decoded_token[1]
False

Если вы измените свой фрагмент Python, чтобы он выглядел так:

import binascii
token = 'BaSe64sTRiNghERe'
decoded_token = binascii.hexlify(token.decode('base64'))
print(decoded_token)

Затем измените ваш фрагмент nodejs, чтобы он выглядел так:

var token = 'BaSe64sTRiNghERe',
decoded_token = Buffer.from(token, 'base64').toString('hex');
console.log(decoded_token);

Вы избежите различий в том, как они обрабатывают непечатаемые символы, и увидите, что декодеры base64 имеют одинаковые байтовые значения.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]