python xmlrpclib base64编码

在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

posted @ 2011-12-09 16:46  dkcndk  阅读(1278)  评论(0编辑  收藏  举报