Python Thrift二进制类型需要编码吗?

时间:2014-12-10 18:55:07

标签: python character-encoding binary thrift

我试图使用'二进制文件' python中的Thrift数据类型用于发送二进制数据。当实际的客户端操作开始时(在发送实际发生之前),客户端会触发一个抱怨UTF编码的异常。 Thrift Python库不支持真正的二进制编码吗?这是因为我使用的是JSON协议,协议并没有为二进制定义保护自己。在引擎盖下,Thrift 0.9.1生成一个二进制文件'字段为'字符串' (对于Java和C ++也是如此)。这是二元'的性质?在这个时间点?

我的Thrift定义和客户端代码段是:

-------------------- Thrift ---------------------
struct Msg {
  1:    binary      aBinary,
}

service Service {
    oneway  void    asyncMsg(   1: Msg   msg),   // Async
}

-------------------- Python ---------------------

socket = TSocket.TSocket(host, port)
transport = TTransport.TFramedTransport(socket)
protocol = TJSONProtocol.TJSONProtocol(transport)
client = Service.Client(protocol)
transport.open()

binaryData = ""
for a in range(0,255):
    binaryData += struct.pack("B",a)

print "Sending a Binary String"
client.asyncMsg(Service.Msg(aBinary = binaryData))

运行python客户端代码时出错.... 错误:无法发送到远程端:' utf8'编解码器不能解码位置128中的字节0x80:无效的起始字节

谢谢, 罗伯特

2 个答案:

答案 0 :(得分:1)

使用Thrift JSON传输,binary数据应该是base64编码的,有或没有填充。由于base64很容易适合8字节字符串,因此您遇到的问题很可能表明Python JSON传输中存在问题。

不幸的是,binary数据类型仍缺少一些测试覆盖率。 This is about to change

答案 1 :(得分:0)

解决方法是使用TBinaryProtocol而不是JSON。 JSON编码要求所有内容都与UTF-8兼容。