«Неправильное заполнение» может означать не только «недостающее заполнение», но также (хотите верьте, хотите нет) «неправильное заполнение».
Если предложенные методы "добавления заполнения" не работают, попробуйте удалить некоторые завершающие байты:
lens = len(strg)
lenx = lens - (lens % 4 if lens % 4 else 4)
try:
result = base64.decodestring(strg[:lenx])
except etc
Обновление: любые попытки добавить отступы или удалить, возможно, плохие байты с конца, должны выполняться ПОСЛЕ удаления любых пробелов, в противном случае расчеты длины будут нарушены.
Было бы неплохо, если бы вы показали нам (короткий) образец данных, которые вам необходимо восстановить. Отредактируйте свой вопрос и скопируйте / вставьте результат print repr(sample)
.
Обновление 2: возможно, что кодирование было выполнено безопасным для URL-адресов способом. В этом случае вы сможете увидеть в своих данных символы минуса и подчеркивания, и вы сможете декодировать их с помощьюbase64.b64decode(strg, '-_')
Если вы не видите в данных символы минуса и подчеркивания, но видите знаки плюса и косой черты, значит, у вас другая проблема, и вам могут понадобиться уловки add-padding или remove-cruft.
Если вы не видите в данных ни минуса, ни подчеркивания, ни плюса, ни косой черты, вам нужно определить два альтернативных символа; это будут те, кого нет в [A-Za-z0-9]. Затем вам нужно будет поэкспериментировать, чтобы увидеть, в каком порядке они должны использоваться во втором аргументеbase64.b64decode()
Обновление 3 : Если ваши данные «конфиденциальны»:
(а) вы должны сообщить об этом заранее
(б) мы можем изучить другие способы понимания проблемы, которая, скорее всего, будет связана с тем, какие символы используются вместо+
и /
в кодирующий алфавит или другие символы форматирования или посторонние символы.
Одним из таких способов было бы изучить, какие нестандартные символы присутствуют в ваших данных, например
from collections import defaultdict
d = defaultdict(int)
import string
s = set(string.ascii_letters + string.digits)
for c in your_data:
if c not in s:
d[c] += 1
print d
base64.b64decode(strg, '-_')
? Это априори, без предоставления каких-либо примеров данных, наиболее вероятное решение вашей проблемы с помощью Python. Предлагаемые "методы" были предложениями ОТЛАДКИ, ОБЯЗАТЕЛЬНО "удачно", учитывая скудность предоставленной информации.