【问题标题】:Decode Base64 in Python that was encoded in Perl在 Python 中解码用 Perl 编码的 Base64
【发布时间】:2020-04-18 08:03:43
【问题描述】:

我有使用 Perl 创建的 base64 编码数据,使用 MIME::Base64encode_base64($data)

结果是:ahX/OxLY/BBR4Wy+n+a3Mg==

当我在 Perl 中解码时,我得到j?;??Q?l???2。如果我把它写到一个文件中,它看起来像这样:jˇ;ÿ¸Q·læüÊ∑2

但是,当我尝试使用相同的 base64 编码数据并使用 python 解码时base64.b64decode(data), I get: b'j\x15\xff;\x12\xd8\xfc\x10Q\xe1l\xbe\x9f\xe6\xb72'`

如果我将其解码为latin1,则结果更接近:'j\x15ÿ;\x12Øü\x10Qál¾\x9fæ·2',但我需要完全相同的数据。

如何从 python 获得完全相同的输出?我错过了什么?

(Perl $data 本身应该是用 urandom read(DEV,$data,16); 生成的。

【问题讨论】:

  • 这可能是相同的数据(以不同的表示形式)。将字节写入文件(以二进制模式,而不是文本)并比较文件。

标签: python perl encoding base64


【解决方案1】:

您已经在 Perl 和 Python 中拥有相同的字符串。

$ perl -e'
   use MIME::Base64 qw( encode_base64 );
   my $raw = "\x6A\x15\xFF\x3B\x12\xD8\xFC\x10\x51\xE1\x6C\xBE\x9F\xE6\xB7\x32";
   CORE::say encode_base64($raw, "");
'
ahX/OxLY/BBR4Wy+n+a3Mg==

$ python3 <<__END_OF_PROG__
import base64
encoded = "ahX/OxLY/BBR4Wy+n+a3Mg==";
expected = b"\x6A\x15\xFF\x3B\x12\xD8\xFC\x10\x51\xE1\x6C\xBE\x9F\xE6\xB7\x32";
raw = base64.b64decode(encoded)
print(raw == expected)
__END_OF_PROG__
True

那是因为base64.b64decode(data) 没有产生

b'j\x15\xff;\x12\xd8\xfc\x10Q\xe1l\xbe\x9f\xe6\xb72'

它产生的是那个 Python 字符串字面量产生的字符串,该字符串由以下 16 个字节(十六进制)组成:

6A 15 FF 3B 12 D8 FC 10 51 E1 6C BE 9F E6 B7 32

这正是您在 Perl 中用来生成 ahX/OxLY/BBR4Wy+n+a3Mg== 的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多