You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:01:02