base64解码在节点中的工作方式与在php,perl或python中的工作方式不同

时间:2017-01-14 01:11:37

标签: php python node.js base64 decoding

我需要解码一个base64令牌以获取身份验证字符串,我在Python,Perl和PHP中找到了一些工作示例,并且我在Node中编写了等效代码,但我遇到了一个问题。似乎Node的base64解码器的工作方式与其他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 个答案:

答案 0 :(得分:-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解码具有相同的字节值。