Python 将Avro十进制解码为bytearray字符串

Python 将Avro十进制解码为bytearray字符串,python,python-3.x,apache-kafka,avro,Python,Python 3.x,Apache Kafka,Avro,我在使用卡夫卡和Avro信息。我的一个字段定义如下: { "name": "a_number", "type": "bytes", "logicalType": "decimal", "precision": 4, "scale": 4 } {"a_number": "\t\u0000°"} 使用Avro console consumer,我看到如下消息: { "name": "a_number", "type": "b

我在使用卡夫卡和Avro信息。我的一个字段定义如下:

{ 
    "name": "a_number", 
    "type": "bytes", 
    "logicalType": "decimal", 
    "precision": 4, 
    "scale": 4 
}
{"a_number": "\t\u0000°"}
使用Avro console consumer,我看到如下消息:

{ 
    "name": "a_number", 
    "type": "bytes", 
    "logicalType": "decimal", 
    "precision": 4, 
    "scale": 4 
}
{"a_number": "\t\u0000°"}
我估计这等于59

据推测,是拜特利。我曾尝试使用Python的模块对其进行解码,但得到的值没有任何意义:

bs = '\t\u0000°'.encode('utf8')    # b'\t\x00\xc2\xb0'
struct.unpack('>l', bs)[0] / 1e4   # 15104.4784

如何验证消息?我是否可以以某种方式解码字符串,或者Avro控制台使用者是否损坏了它?

您似乎正在艰难地处理这一问题。建议的方法是使用:

reader = avro.datafile.DataFileReader(open('filename.avro',"rb"),avro.io.DatumReader())
schema = reader.meta

在调试器中单步查看阅读器如何解码您的消息应该可以让您更接近于组装原始的手工解码。

比较:struct.pack'>l',int59*1e4==b'\x00\t\x00\xb0'您确定要将高ASCII值编码为UTF-8吗?然后,它们将获得至少一个额外字节,这将影响总值。也就是说,至少您将获得4个字节。您的示例字符串仅定义了3。@usr2564301是的,我不确定-它确实看起来很奇怪。我选择UTF-8的原因是JSON使用UTF-8编码字符串,而Avro控制台使用者的输出显然是JSON。我对那根弦有点敏感;我本以为它会用Base64写些什么的。是的,说得对。我没有.avro文件可读,但也许我应该使用AvroConsumer编写一个小Python脚本,而不是使用基于Java的控制台使用者来测试它。