По какой-то причине я не могу получить следующий фрагмент кода с ошибкой, хотя и должен.
Вызов функции декодирования base64 в python2 decodestring
с непечатными символами, однако я ожидаю, что возникнет исключение:
In [1]: import base64
In [2]: base64.decodestring("\x01\x01\x01")
Out[2]: ''
Для сравнения, использование метода класса строки дает тот же результат:
In [7]: "\x01\x01\x01".decode("base64")
Out[7]: ''
Однако выполнение эквивалента для hex действительно обеспечит ожидаемое поведение (обратите внимание, что дополнительный символ был добавлен ввыровняйте по кратным двум, как и ожидалось шестнадцатеричным декодером):
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
Несколько других попыток доказали, что встречается такое поведение, что декодер 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:
Такое поведение также наблюдается независимо от метода, используемого для выполнения встроенного кодека base64, который связан с python2.7.
Кроме того, любой действительный символ будет обработан должным образом, что приведет к странным результатам, таким как:
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'
Мой вопрос состоит из двух частей:
- Правильно ли я анализирую это поведение?
- Почему это поведение реализовано вместо соответствия другим кодекам и
errors="strict"
API?