Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python节约二进制类型需要编码?_Python_Character Encoding_Binary_Thrift - Fatal编程技术网

Python节约二进制类型需要编码?

Python节约二进制类型需要编码?,python,character-encoding,binary,thrift,Python,Character Encoding,Binary,Thrift,我试图使用python中的“二进制”节约数据类型来发送二进制数据。当实际的客户端操作开始时(在发送实际发生之前),客户端触发一个异常,抱怨UTF编码。Thrift Python库不支持真正的二进制编码吗?这是因为我使用的是JSON协议,而该协议不为二进制定义保护自身。在后台,Thrift 0.9.1生成了一个“二进制”字段作为“字符串”(Java和C++也是如此)。这就是此时“二进制”的本质吗 我的Thrift定义和客户机代码段如下: -------------------- Thrift --

我试图使用python中的“二进制”节约数据类型来发送二进制数据。当实际的客户端操作开始时(在发送实际发生之前),客户端触发一个异常,抱怨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:无效的开始字节

谢谢,
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++也是一样的。我想那些语言有用吗?