Python2 base64严格解码仍然默默地忽略无效字符

时间:2019-03-05 14:02:14

标签: python python-2.7 base64

出于某些原因,我无法使以下代码段出错,但应该出错。

我用不可打印的字符调用python2的base64解码函数rs570876887 chr17:20501765-20501766 - ENSG00000214822 ENST00000439127 Transcript splice_acceptor_variant,intron_variant,non_coding_transcript_variant - - - - - rs570876887 TG HIGH - -1 - deletion KRT16P3 HGNC HGNC:37808 transcribed_unprocessed_pseudogene - - - - - - - - - Ensembl TG TG - - - - - 7/7 - ENST00000439127.6:n.1189-3_1189-2del - - 0.0140 0.0272 0.0086 0.001 0.0109 0.0164 - - - - - - - - - - - 0.0272 AFR - - - - rs570876887 chr17:20501765-20501766 - ENSG00000214822 ENST00000580621 Transcript splice_acceptor_variant,intron_variant,non_coding_transcript_variant - - - - - rs570876887 TG HIGH - -1 - deletion KRT16P3 HGNC HGNC:37808 retained_intron YES 1 - - - - - - - Ensembl TG TG - - - - - 6/6 - ENST00000580621.5:n.1689-3_1689-2del - - 0.0140 0.0272 0.0086 0.001 0.0109 0.0164 - - - - - - - - - - - 0.0272 AFR - - - - rs570876887 chr17:20501765-20501766 - 644945 NR_029393.1 Transcript splice_acceptor_variant,intron_variant,non_coding_transcript_variant - - - - - rs570876887 TG HIGH - -1 - deletion KRT16P3 EntrezGene HGNC:37808 transcribed_pseudogene - - - - - - - - - RefSeq TG TG OK - - - - 6/6 - NR_029393.1:n.1706-3_1706-2del - - 0.0140 0.0272 0.0086 0.001 0.0109 0.0164 - - - - - - - - - - - 0.0272 AFR - - - - rs570876887 chr17:20501765-20501766 - ENSG00000214822 ENST00000584759 Transcript non_coding_transcript_exon_variant 428-429 - - - - rs570876887 TG MODIFIER - -1 - deletion KRT16P3 HGNC HGNC:37808 retained_intron - 5 - - - - - - - Ensembl TG TG - - - - 2/2 - - ENST00000584759.1:n.428_429del - - 0.0140 0.0272 0.0086 0.001 0.0109 0.0164 - - - - - - - - - - - 0.0272 AFR - - - - rs570876887 chr17:20501765-20501766 - ENSG00000214822 ENST00000580113 Transcript downstream_gene_variant - - - - - rs570876887 TG MODIFIER 773 -1 - deletion KRT16P3 HGNC HGNC:37808 processed_transcript - 3 - - - - - - - Ensembl TG TG - - - - - - - - - - 0.0140 0.0272 0.0086 0.001 0.0109 0.0164 - - - - - - - - - - - 0.0272 AFR - - - - ,但是我希望会引发一个异常,

decodestring

为了进行比较,使用字符串类的方法会产生相同的结果:

In [1]: import base64

In [2]: base64.decodestring("\x01\x01\x01")
Out[2]: ''

无论如何,对十六进制进行等效操作确实可以提供预期的行为(请注意,如十六进制解码器所预期的,添加了一个附加字符以使其与2的倍数对齐):

In [7]: "\x01\x01\x01".decode("base64")
Out[7]: ''

其他几次尝试证明,遇到的行为是base64解码器(具体而言,忽略)而不是发出任何错误字符。尽管已证明解码器仅支持默认的严格错误处理模式,但仍会出现这种现象:

In [9]: "\x01\x01\x01\x01".decode("hex")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-1e73b7069a1d> in <module>()
----> 1 "\x01\x01\x01\x01".decode("hex")

/usr/lib/python2.7/encodings/hex_codec.pyc in hex_decode(input, errors)
     40     """
     41     assert errors == 'strict'
---> 42     output = binascii.a2b_hex(input)
     43     return (output, len(input))
     44

TypeError: Non-hexadecimal digit found

无论执行哪种方法来执行与python2.7捆绑在一起的内置base64编解码器,该行为也都会发生。

此外,任何有效字符都将得到正确处理,产生如下奇怪的结果:

In [11]: "\x01\x01\x01".decode("base64", errors="ignore")
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-11-e0b65726a302> in <module>()
----> 1 "\x01\x01\x01".decode("base64", errors="ignore")

/usr/lib/python2.7/encodings/base64_codec.pyc in base64_decode(input, errors)
     39
     40     """
---> 41     assert errors == 'strict'
     42     output = base64.decodestring(input)
     43     return (output, len(input))

AssertionError:

我的问题有两个:

  1. 我对这种行为的分析是否正确?
  2. 为什么要执行此行为而不是与其他编解码器和In [6]: base64.decodestring("\x01\x01\x01\x01\x01AA==") Out[6]: '\x00' In [7]: base64.decodestring("\x01A\x01A\x01=\x01=\x01A") Out[7]: '\x00' In [8]: base64.decodestring("\x01Not\x01A\x01Base64\x01String\x01") Out[8]: '6\x8b@\x05\xab\x1e\xeb\x84\xad\xae)\xe0' API保持一致?

1 个答案:

答案 0 :(得分:1)

base64的发明是为了将二进制文件封装为纯文本协议。这些协议可能还有其他限制,例如一行的最大大小,这要求在base64编码的字符串中插入行尾。为了尽可能地容忍输入,许多解码器决定忽略任何非打印字符。

这就是设计Python base64模块的方式。