Pyshark如何读取数据包全量字段值并转换为字典格式
读取PyShark数据包跨层全量字段字典方案
不存在可直接调用的cap[0]._all_fields内置跨层字段属性,直接遍历所有协议层合并字段即可实现需求,兼容所有主流PyShark版本。
- 稳定实现方案:循环遍历数据包的每一层,逐层合并
_all_fields到总字典,代码如下
def get_packet_all_fields(pkt): full_fields = {} for layer in pkt.layers: full_fields.update(layer._all_fields) return full_fields # 调用示例 all_fields_dict = get_packet_all_fields(cap[0])
该方法返回的字典会覆盖从链路层到应用层所有协议的全量字段,和预期的跨层全量字段返回效果完全一致。如果遇到不同层存在同名字段的特殊场景,不想让高层字段覆盖低层值,可以给字段名加层名前缀做区分,调整合并逻辑即可:
def get_packet_all_fields(pkt): full_fields = {} for layer in pkt.layers: # 给每个字段加协议层前缀,格式为「协议名.字段名」,比如ip.src、tcp.port layer_fields = {f"{layer.layer_name}.{field_name}": field_val for field_name, field_val in layer._all_fields.items()} full_fields.update(layer_fields) return full_fields
- 不推荐的快捷写法:部分旧版本PyShark会在数据包对象上缓存全量字段名,可直接通过字典推导式生成结果,但新版本已经移除了相关内部属性,跨版本兼容性极差,仅做了解:
# 仅适配0.4.2之前的旧版PyShark,高版本运行会抛出属性错误 all_fields_dict = {f: cap[0].get_field(f) for f in cap[0].field_names}
内容的提问来源于stack exchange,提问作者chandan
相关产品推荐
相关产品推荐

