当前位置: 首页 > 知识库问答 >
问题:

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

寇夜洛
2023-03-14

我试图使用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:无效的起始字节

谢了罗伯特

共有2个答案

锺离昂然
2023-03-14

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

许展鹏
2023-03-14

使用Thrift JSON传输,二进制数据预计将被base 64编码,带或不带填充。由于base 64甚至可以轻松放入8字节的字符串中,因此您面临的问题很可能表明Python JSON传输中存在问题。

不幸的是,二进制数据类型仍然缺乏一些测试覆盖率。这即将改变。

 类似资料:
  • 主要内容:BIT 类型,BINARY 和 VARBINARY 类型,BLOB 类型MySQL 支持两类字符型数据:文本字符串和二进制字符串。上节《 MySQL字符串类型》我们讲了文本字符串,这节我们来讲解二进制字符串。 二进制字符串类型有时候也直接被称为“二进制类型”。 MySQL 中的二进制字符串有 BIT、 BINARY、 VARBINARY、 TINYBLOB、 BLOB、 MEDIUMBLOB 和 LONGBLOB。 下表中列出了 MySQL 中的二进制数据类型,括号中

  • 对于这个函数,我得到了 错误ORA-00932:不一致的数据类型:预期的长二进制得到BLOB ORA-06512:在“CaslengthoFlongraw”,第7行009 32。00000-“不一致的数据类型:应为%s得到%s”

  • 问题内容: 有没有一种类型或方式以二进制级别在oracle中存储数据。我对表中的dml和pl / sql的操作都感兴趣。 当前所有二进制元素都以varchar2(1000)=‘11111 …0000.1111’的形式存储,但是操作和数据存储量很大,因此需要一些优化解决方案。如果此数据可以二进制格式存储,则将需要1000/8字节(具有>700mn条记录) 可能的解决方案是对这些操作使用某种Java

  • 用途: 在字符串与二进制数据之间相互转换 打包和拆包 import struct import binascii values = (1, 'ab'.encode('utf-8'), 2.7) s = struct.Struct('I 2s f') packed_data = s.pack(*values) print('Original values:', values) print('Fo

  • 我想将二进制字符串更改为 我试图找到这个问题的答案,但没能找到。我尝试使用split()。

  • 这是一个考题,我想一定有更有效的方法。(我也知道有一种方法可以直接转换二进制数,而不需要经过二进制字符串,但我不知道如何转换)。 这就是问题所在: 给出了一个由Q字符组成的非空零索引字符串S。该字符串的周期是最小的正整数P,使得: P≤ Q/2和S[K]=S[kp]表示0≤ K 例如,8是“Codilityco”的时期。如果M是N的二进制表示的周期,则正整数M是正整数N的二进制周期。 例如,4是9