Python节约二进制类型需要编码?
我试图使用python中的“二进制”节约数据类型来发送二进制数据。当实际的客户端操作开始时(在发送实际发生之前),客户端触发一个异常,抱怨UTF编码。Thrift Python库不支持真正的二进制编码吗?这是因为我使用的是JSON协议,而该协议不为二进制定义保护自身。在后台,Thrift 0.9.1生成了一个“二进制”字段作为“字符串”(Java和C++也是如此)。这就是此时“二进制”的本质吗 我的Thrift定义和客户机代码段如下:Python节约二进制类型需要编码?,python,character-encoding,binary,thrift,Python,Character Encoding,Binary,Thrift,我试图使用python中的“二进制”节约数据类型来发送二进制数据。当实际的客户端操作开始时(在发送实际发生之前),客户端触发一个异常,抱怨UTF编码。Thrift Python库不支持真正的二进制编码吗?这是因为我使用的是JSON协议,而该协议不为二进制定义保护自身。在后台,Thrift 0.9.1生成了一个“二进制”字段作为“字符串”(Java和C++也是如此)。这就是此时“二进制”的本质吗 我的Thrift定义和客户机代码段如下: -------------------- 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:无效的开始字节
谢谢,
Robert解决方法是使用TBinaryProtocol而不是JSON。JSON编码要求所有内容都与UTF-8兼容。对于Thrift JSON传输,
二进制
数据应为base64编码,有无填充。由于base64甚至可以轻松放入8字节的字符串中,因此您面临的问题很可能表明Python JSON传输中存在问题
不幸的是,
二进制
数据类型仍然缺乏一些测试覆盖率 使用TBinaryProtocol确实解决了这个问题,但我希望使用JSON编码来允许客户端和服务器之间的其他实体。这是有意义的,因为JSON在整个文档中都被定义为UTF-8。“二进制”IDL类型不可用于JSON协议。不同意。二进制文件也应该与JSON一起使用。“此时字符串是否是‘二进制’的性质?”-二进制是这样添加的,没错。所以你会在代码库中找到类似的东西,是的。尽管如此,它还是应该起作用。如果它没有…将“解决方案”编辑为“变通方法”,因为这才是真正的解决方案。如果根据定义,JSON应该编码为UTF-8,那么二进制数据必须编码为一种形式,可以在类型“字符串”的赋值中使用,不是吗?JSON编码似乎试图进行赋值,但上述测试失败。测试在高阶位为“1”的第一个字节处恰好失败。“二进制”IDL类型不可用于JSON协议”-抱歉,但错误。通过JSON传输二进制
数据应该与Python使用其他所有语言的方式完全相同。如果不起作用,请使用Python绑定。遗憾的是,这是真的。可能Python绑定被破坏了,因为在生成的代码中,“二进制”产生的结果与“字符串”相同。原来java和C++也是一样的。我想那些语言有用吗?