python b64decode неверное заполнение - PullRequest
3 голосов
/ 23 мая 2011

Я отправляю файл поверх небольших пакетов UDP.(python 3) На сервере я делю файл на мелкие кусочки и делаю

packets.append(b64encode(smallPart))

, с другой стороны делаю прямо противоположное

packets.append(b64decode(peice))    

Однако я продолжаю получатьвсе, кроме пакета) Неверное исключение заполнения

Существует ли стандартный размер для b64decode, который я пропускаю?

Ответы [ 4 ]

5 голосов
/ 24 мая 2011

Base 64 работает, кодируя каждые 3 байта в 4 байта.При декодировании он берет эти 4 байта и преобразует их обратно в 3 байта.Если на входе осталось менее 3 байтов, то на выходе по-прежнему добавляется '=', чтобы получить 4 байта.Если вход для b64decode не кратен 4 байтам, вы получите исключение.

Самое простое решение для вас - убедиться, что ваши пакеты всегда кратны 4 байтам.

4 голосов
/ 24 мая 2011

Ваше описание того, что вы делаете, звучит нормально. Выбор размера входного элемента влияет только на эффективность. Байты заполнения минимизируются, если длина каждого входного фрагмента (кроме, конечно, последнего) кратна 3.

Вам необходимо показать нам как код вашего сервера, так и код вашего клиента. Альтернативно: на сервере запишите входные данные и переданные фрагменты. На клиенте зарегистрируйте полученные кусочки. Сравните.

Любопытство: почему бы вам просто не b64 кодировать всю строку, разделить кодированный результат, как вам нравится, передать фрагменты, на клиенте собрать части, используя b''.join(pieces) и b64decode, что?

Дальнейшее любопытство: я думал, что содержимое пакета UDP может быть любым старым двоичным набором байтов; зачем ты вообще кодируешь base64?

2 голосов
/ 24 мая 2011

Длина любой правильно закодированной строки base64 должна делиться на 4.

Base64 кодирует 3 байта как 4, поэтому, если вы начинаете с длины строки, которая не кратна 3, алгоритм добавляетодин или два = символа в конце закодированной формы, по одному на каждый байт, кратный некоторому кратному 3 (см. http://en.wikipedia.org/wiki/Base64#Padding).

Способ получения выравнивания, количество = символовтакже равно числу символов, кратных 4, в закодированной форме.

1 голос
/ 30 апреля 2015

Я пытался декодировать URL-безопасную строку в кодировке base64.Просто заменив "."с "=" добился цели.

s = s.replace('.', '=')
# then base64decode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...