【问题标题】:Deserialization, fixed data type in Avro反序列化,Avro 中的固定数据类型
【发布时间】:2021-08-24 17:03:02
【问题描述】:

我是 avro 新手,我有一个要反序列化的 avro 文件。一些模式使用固定类型的数据来存储 MAC 地址。下面的模式是其中一种模式,并在不同的模式中作为一种类型使用。

MAC 地址的架构如下:

{
    "type": "fixed",
    "name": "MacAddress",
    "size": 6
}

我使用以下方法将数据的第一条记录写入文本文件:

from avro.datafile import DataFileReader
from avro.io import DatumReader

reader = DataFileReader(open("data.avro", "rb"), DatumReader())
count = 0
for record in reader:
    if count == 0:
        with open('first_record.txt', 'w') as first_record:
            first_record.write(str(record))
    elif count > 0: break
    count = count + 1
reader.close()

上面提到的 MAC 地址出现在反序列化的数据中,例如:

"MacAddress":"b""\\x36\\xe9\\xad\\x64\\x2d\\x3d",

我知道 \x 表示以下是十六进制值。所以这应该是“36:e9:ad:64:2d:3d”,对吧? "b""" 样式值是固定类型的预期输出吗?

另外,一些值如下:

"Addr":"b""j\\x26\\xb7\\xda\\x1d\\xf6"

"Addr":"b""\\x28\\xcb\\xc5v\\x14%" 

为什么这些是 MAC 地址? j、%字符是什么意思?

【问题讨论】:

    标签: python avro fastavro


    【解决方案1】:

    “b”“”样式值是固定类型的预期输出吗?

    是的,因为固定类型表示字节,而在 Python 上,字节字符串表示为在事物字符串之前添加 b。看起来你在那里有很多额外的引号,我猜那是因为你正在做像str(record) 这样的事情,这可能会导致额外的反斜杠和引号字符。例如:

    
    >>> str(b"\xae")
    "b'\\xae'"
    

    为什么这些是 MAC 地址? j、%字符是什么意思?

    您确定这些记录类型相同吗?关键是 Addr 而不是 MacAddress 所以看起来它可能是不同的记录类型和架构。

    【讨论】:

    • 是的,我在几个小时前注意到了同样的事情。我在写入文件后使用了 json 格式化程序,格式化程序导致了额外的反斜杠和引号。通常它就像 "Addr": b'j\x26\xb7\xda\x1d\xf6 并且在这些字节字符串上简单使用 .hex() 方法给了我我想要的东西。是的,它们具有相同的架构,mac 地址架构被许多具有不同名称的记录使用。
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2021-12-01
    • 2018-12-10
    • 2020-03-04
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多