Python 读取嵌入到 PCAP 中的 AVRO

问题描述 投票:0回答:1

我有一个 PCAP 文件,其中包含 AVRO 编码数据作为 TCP 数据包中的有效负载。为了测试目的,我使用

xxd -r -p test.hex test.bin
将提到的有效负载转换为二进制文件。 (稍后我将使用 scapy 与 PCAP 一起工作)。下面的代码生成错误“AssertionError:-29”。

我有一个有效的模式并查看二进制文件,我看到预期的第一个字段“1.0.0”:

00000000    00 00 00 01 00 06 02 04 96 9e 77 35 00 00 08 00     ..........w5....
00000010    45 00 01 ea 19 f6 40 00 3c 06 2a 59 83 a0 aa 7e     E....@.<.*Y...~
00000020    0a 2d c0 73 92 16 37 ca c9 28 f5 36 42 80 5f 1c     .-.s.7..(.6B._
00000030    80 18 00 e5 ab 64 00 00 01 01 08 0a 03 67 d9 fd     ....d.......g..
00000040    65 e1 ee 11 01 b6 03 00 00 00 00 00 00 00 02 0a     e...............
00000050    31 2e 30 2e 30 0a 32 30 2e 51 32 26 43 58 50 39     1.0.0

环境:“图像”:“mcr.microsoft.com/devcontainers/python:1-3.11-buster”

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

schema = avro.schema.parse(open("test.avsc").read())
reader = DatumReader(schema)

f = open("test.bin", mode="rb")
f.seek(79)
raw_bytes = f.read()
print(raw_bytes)

buff = io.BytesIO(raw_bytes)
elements = DataFileReader(buff, reader)

期望读取 AVRO 编码数据,因为我有一个有效的架构。

如果我更改

f.seek(74)
,我会收到不同的错误“avro.schema.AvroException:不是 Avro 数据文件:b'\x00\x00\x00\x00' 与 b'Obj\x01' 不匹配。”我认为这是预期的,因为我的二进制文件没有在标头中嵌入 AVRO 模式。已经花了 2 天的时间尝试和谷歌搜索。

python avro
1个回答
0
投票

我知道标准 avro 库中有一种方法可以做到这一点,但我维护 python 库

fastavro
,所以我对标准 avro 库不太熟悉。要在 fastavro 中执行此操作,您应该能够执行以下操作:

import fastavro
import json

with open("test.avsc") as schema_file:
    schema = json.load(schema_file)

with open("test.bin", mode="rb") as fp:
    record = fastavro.schemaless_reader(fp, schema)

注意:可能会有一些错别字或轻微错误。我直接在答案中输入此内容而不进行检查,因为我没有标题来验证它是否有效。

© www.soinside.com 2019 - 2024. All rights reserved.