【发布时间】:2019-04-24 13:28:33
【问题描述】:
我正在使用带有 Avro 消息的 Kafka。我的一个字段是这样定义的:
{
"name": "a_number",
"type": "bytes",
"logicalType": "decimal",
"precision": 4,
"scale": 4
}
使用 Avro 控制台使用者,我看到如下消息:
{"a_number": "\t\u0000°"}
我希望等于59。
据说是字节数组should be the twos-compliment of the number。我尝试使用 Python 的 struct 模块对其进行解码,但我得到的值没有任何意义:
bs = '\t\u0000°'.encode('utf8') # b'\t\x00\xc2\xb0'
struct.unpack('>l', bs)[0] / 1e4 # 15104.4784
如何验证消息?我可以以某种方式解码字符串,还是 Avro 控制台消费者损坏了它?
【问题讨论】:
-
比较:
struct.pack('>l', int(59 * 1e4)) == b'\x00\t\x00\xb0' -
您确定要将高位 ASCII 值编码为 UTF-8 吗?然后,它们将获得至少一个额外的字节,这将影响总值。也就是说,至少你会得到 4 个字节。您的示例字符串仅定义 3.
-
@usr2564301 是的,我不确定——看起来确实很奇怪。我选择 UTF-8 的原因是 JSON 使用它来编码字符串,而 Avro 控制台使用者的输出(显然)是 JSON。我对那个字符串有点怀疑;我本来希望它会用 Base64 左右写一些东西。
标签: python python-3.x apache-kafka avro