我试图使用'二进制文件' 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:无效的起始字节
谢谢, 罗伯特
答案 0 :(得分:1)
使用Thrift JSON传输,binary
数据应该是base64编码的,有或没有填充。由于base64很容易适合8字节字符串,因此您遇到的问题很可能表明Python JSON传输中存在问题。
不幸的是,binary
数据类型仍缺少一些测试覆盖率。 This is about to change
答案 1 :(得分:0)
解决方法是使用TBinaryProtocol而不是JSON。 JSON编码要求所有内容都与UTF-8兼容。