我正在尝试在python中使用'binary'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:无效的起始字节
谢谢,
罗伯特
最佳答案
通过Thrift JSON传输,binary
数据应采用base64编码,并带有或不带有填充。由于base64甚至可以轻松地适合8个字节的字符串,因此您面临的问题很可能表明Python JSON传输中存在问题。
不幸的是,binary
数据类型仍然缺乏一些测试覆盖范围。 This is about to change。
关于python - Python Thrift二进制类型需要编码吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27408710/