我需要解码一个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);
});
我仍然得错了。
答案 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解码具有相同的字节值。