出于某些原因,我无法使以下代码段出错,但应该出错。
我用不可打印的字符调用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:
我的问题有两个:
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保持一致?答案 0 :(得分:1)
base64的发明是为了将二进制文件封装为纯文本协议。这些协议可能还有其他限制,例如一行的最大大小,这要求在base64编码的字符串中插入行尾。为了尽可能地容忍输入,许多解码器决定忽略任何非打印字符。
这就是设计Python base64模块的方式。