在xmlrpclib中,需要傳送二進位的資料,因此使用了Binary Objects來打包,寫了如下兩個函數:
def encodebindata(data):
out = StringIO.StringIO()
bin = xmlrpclib.Binary()
bin.data = data
bin.encode(out)
data2 = out.getvalue()
return data2
def decodebindata(data):
bin = xmlrpclib.Binary()
data1 = bin.decode(data)
return bin.data
在調用decodebindata函數解碼的時候,老是出錯,提示”binascii.Error: incorrect padding”之類的。看了一下xmlrpclib.py裡面的Binary 類定義:
def decode(self, data):
self.data = base64.decodestring(data)
def encode(self, out):
out.write(”<value><base64>n”)
base64.encode(StringIO.StringIO(self.data), out)
out.write(”</base64></value>n”)
Binary的編解碼其實用到的是base64的decodestring和encode,感覺不太匹配,base64中,encode應該和decode配對,decodestring和encodestring配對。因此嘗試了一下直接使用base64來打包,不使用xmlrpclib的Binary Objects。重新定義兩個函數如下:
def encodebindata(data):
out = StringIO.StringIO()
bin = StringIO.StringIO(data)
base64.encode(bin,out)
data2 = out.getvalue()
return data2
def decodebindata(data):
out = StringIO.StringIO()
bin = StringIO.StringIO(data)
base64.decode(bin,out)
data2 = out.getvalue()
return data2
經過測試,沒有任何問題了
xmlrpclib的Binary Objects打包之後就是xml形式的資料了,可以直接傳送了。不能打包之後立即解包。
from:http://blog.robotercoding.com/?cat=5&paged=2