Python b64decode relleno incorrecto

Estoy enviando un archivo a través de pequeños paquetes UDP. (Python 3) En el servidor divido el archivo en trozos pequeños y lo hago

packets.append(b64encode(smallPart)) 

En el otro lado hago exactamente lo contrario.

 packets.append(b64decode(peice)) 

Sin embargo, sigo recibiendo (en todo menos en el paquete) la excepción de relleno incorrecto

¿Hay un tamaño estándar para b64decode que me falta?

Su descripción de lo que está haciendo suena bien. La elección del tamaño de la pieza de entrada afecta solo a la eficiencia. Los bytes de relleno se minimizan si la longitud de cada pieza de entrada (excepto, por supuesto, la última) es un múltiplo de 3.

Debe mostrarnos tanto su código de servidor como su código de cliente. Alternativamente: en el servidor, registre la entrada y las piezas transmitidas. En el cliente, registrar las piezas recibidas. Comparar.

Curiosidad: ¿por qué no simplemente codifica la cadena completa, divide el resultado codificado como quiera, transmita las piezas, en el cliente, vuelva a ensamblar las piezas con b''.join(pieces) Join b''.join(pieces) y b64, decodifique eso?

Más curiosidad: pensé que el contenido de un paquete UDP podría ser cualquier antiguo grupo de bytes binarios; ¿Por qué estás haciendo encoding base64?

La base 64 funciona codificando cada 3 bytes en 4 bytes. Al decodificar, toma esos 4 bytes y los convierte de nuevo a 3 bytes. Si quedaban menos de 3 bytes en la entrada, la salida todavía se rellena con ‘=’ para hacer 4 bytes. Si la entrada a b64decode no es un múltiplo de 4 bytes, obtendrá la excepción.

La solución más fácil para usted será asegurarse de que sus paquetes sean siempre un múltiplo de 4 bytes.

La longitud de cualquier cadena base64 correctamente codificada debe ser divisible por 4.

Base64 codifica 3 bytes como 4, así que si comienza con una longitud de cadena que no es un múltiplo de 3, el algoritmo agrega uno o dos caracteres = al final de la forma codificada, uno para cada byte menos de un múltiplo de 3 (Ver http://en.wikipedia.org/wiki/Base64#Padding ).

De la forma en que se produce la alineación, el número de = caracteres también es igual al número de caracteres que se parecen a un múltiplo de 4 en la forma codificada.

Había estado tratando de decodificar una cadena codificada en base64 segura para URL. Simplemente reemplazando “.” con “=” hizo el truco para mí.

 s = s.replace('.', '=') # then base64decode