2011-05-23 67 views
3

我正在通過小的UDP數據包發送一個文件。 (蟒蛇3) 在服務器上我對文件進行分割成小塊,在另一側做python b64decode不正確的填充

packets.append(b64encode(smallPart)) 

我反其道而行之

packets.append(b64decode(peice))  

不過,我不斷收到(所有未上數據包)不正確的填充異常

是否有我缺少的b64decode的標準大小?

+2

您確定要發送的數據是您收到的數據嗎?你總是可以添加'assert b64decode(b64encode(smallPart))== smallPart'來確保這些函數可以工作。 – 2011-05-23 20:17:11

回答

4

你對你在做什麼的描述聽起來不錯。輸入件尺寸的選擇隻影響效率。如果每個輸入片段的長度(當然除了最後一個)的長度是3的倍數,則填充字節會最小化。

您需要向我們顯示您的服務器代碼和您的客戶端代碼。或者:在服務器上,記錄輸入和傳輸的部分。在客戶端,記錄收到的作品。比較。好奇心:爲什麼你不只是對整個字符串進行編碼,而是將你喜歡的編碼結果進行拆分,然後在客戶端傳輸這些碎片,然後使用b''.join(pieces)和b64解碼這些碎片進行重新組裝?

進一步的好奇心:我認爲UDP數據包的內容可能是任何舊的二進制字節串;你爲什麼要做base64編碼?

+0

Machin: 好奇心:我將結果寫入標準輸出,對於大文件加入的影響會很大 進一步好奇:編碼隱藏數據,嘗試通過dns協議加密文件 – msshapira 2011-05-25 05:05:33

+1

@msshapira:b64encode!= encryption它沒有隱藏任何東西;事實上base64數據很容易被識別出來。無論如何,你有沒有發現你的問題是什麼?你打算接受答案嗎? – 2011-05-25 07:54:50

5

基地64通過編碼每3個字節到4個字節。解碼時,需要這4個字節並將它們轉換回3個字節​​。如果輸入中剩餘的字節少於3個字節,輸出仍然用'='填充以產生4個字節。如果b64decode的輸入不是4字節的倍數,你將會得到異常。

最簡單的解決方案將是確保您的數據包始終是4個字節的倍數。

+0

將3個字節分成4個字符將需要3的倍數而不是4! – msshapira 2011-05-23 20:19:06

+0

3個字節的輸入= 4個字節的輸出,所以他說你最終應該是4的倍數。 – 2011-05-23 20:21:17

+0

@msshapira,我的術語很sl I,我會解決它的。 – 2011-05-23 20:31:20

2

任何適當base64編碼字符串的長度應該是整除4.

的Base64編碼3個字節爲4,因此,如果與串的長度,這不是3的倍數開始時,則算法增加一個或編碼形式末尾的兩個=字符,每個字節對應3的某個倍數(見http://en.wikipedia.org/wiki/Base64#Padding)。

對齊出來的方式,=字符的數量也等於編碼形式中字符數4的倍數的字符數。

1

我一直在嘗試解碼URL安全的base64編碼字符串。簡單地取代「。」與「=」爲我做了詭計。

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