开发者

python b64decode incorrect padding

开发者 https://www.devze.com 2023-03-07 17:25 出处:网络
I\'m sending a file over small UDP packets.(python 3) On the server I divide the file into small pieces and do

I'm sending a file over small UDP packets. (python 3) On the server I divide the file into small pieces and do

pack开发者_开发问答ets.append(b64encode(smallPart))

on the other side I do exactly the opposite

packets.append(b64decode(peice))    

However, I keep getting (in all but on packet) Incorrect Padding exception

Is there a standard size for b64decode that I'm missing?


Base 64 works by encoding every 3 bytes into 4 bytes. When decoding, it takes those 4 bytes and converts them back to 3 bytes. If there were less than 3 bytes remaining in the input, the output is still padded with '=' to make 4 bytes. If the input to b64decode is not a multiple of 4 bytes you will get the exception.

The easiest solution for you will be to make sure your packets are always a multiple of 4 bytes.


Your description of what you are doing sounds OK. Choice of the input piece size affects only the efficiency. Padding bytes are minimised if the length of each input piece (except of course the last) is a multiple of 3.

You need to show us both your server code and your client code. Alternatively: on the server, log the input and the pieces transmitted. On the client, log the pieces received. Compare.

Curiosity: Why don't you just b64encode the whole string, split the encoded result however you like, transmit the pieces, at the client reassemble the pieces using b''.join(pieces) and b64decode that?

Further curiosity: I thought the contents of a UDP packet could be any old binary bunch of bytes; why are you doing base64 encoding at all?


The length of any properly encoded base64 string should be divisible by 4.

Base64 encodes 3 bytes as 4, so if you start out with a length of string that's not a multiple of 3, the algorithm adds one or two = characters on the end of the encoded form, one for each byte shy of some multiple of 3 (see http://en.wikipedia.org/wiki/Base64#Padding).

The way the alignment comes out, the number of = characters also equals the number of characters shy of a multiple of 4 in the encoded form.


I had been trying to decode an URL-safe base64 encoded string. Simply replacing "." with "=" did the trick for me.

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

精彩评论

暂无评论...
验证码 换一张
取 消