Python 数据包处理

在Python中处理多个数据包时,通常的做法是将数据包存储在列表或队列中,然后逐个处理它们。以下是一个简单的示例,说明如何在处理完第一个数据包后处理第二个数据包:

# 假设我们有一个包含多个数据包的列表
packets = [
    "Packet (Length: 66) ...",  # 第一个数据包
    "Packet (Length: 66) ...",  # 第二个数据包
    # ... 可能还有更多的数据包
]

def process_packet(packet):
    # 在这里实现处理数据包的逻辑
    print("Processing packet:")
    print(packet)

# 遍历数据包列表,逐个处理
for packet in packets:
    process_packet(packet)
    # 处理完第一个数据包后,代码会自动继续到下一个数据包

在这个例子中,process_packet 函数被用来处理每个数据包。我们通过遍历 packets 列表来逐个处理数据包。当处理完第一个数据包后,循环会自动继续到列表中的下一个元素,即第二个数据包。

如果你需要根据某些条件来决定是否跳过某些数据包或者以特定的顺序处理数据包,你可以在 process_packet 函数中添加相应的逻辑,或者在循环中使用条件语句来实现。

例如,如果你想跳过长度小于某个值的数据包,你可以在循环中添加一个条件检查:

# 假设我们只处理长度大于50的数据包
for packet in packets:
    if len(packet) > 50:
        process_packet(packet)
    else:
        print("Skipping packet due to length:", len(packet))

这样,只有长度大于50的数据包会被处理。

数据优化 pandas

考虑使用更高效的数据结构来存储解析后的数据,例如使用 pandas 库来创建数据帧(DataFrame),这将使数据处理和显示更加高效。
将解析后的数据转换为 DataFrame,这样可以利用 pandas 的高效数据处理能力。使用 DataFrame 可以简化数据的读取、过滤、排序和显示过程,同时提供更丰富的数据操作功能。

import pandas as pd

# 假设这些变量是你从某处解析得到的数据
ONU_ID = '0001'
Message_type = '09'
SeqNo = '00'
Vendor_ID = 'VENDOR123'
VSSN = '12345'
padding = 'PAD'
MIC = 'MIC123'
Random_delay = 'RD123'
Registration_ID = 'REG123'
Report_type = 'RPT'
Key_index = 'K1'
Fragment_number = 'F1'
Reserved = 'RSVD'
Key_Fragment = 'KF123'
completion_code = '01'
activity_level = '0'

# 创建一个空的DataFrame来存储解析后的数据
df = pd.DataFrame()

# 填充数据逻辑
df = pd.concat([df, pd.DataFrame({
    'ONU_ID': [ONU_ID],
    'Message_type': [Message_type],
    'SeqNo': [SeqNo],
    'Vendor_ID': [Vendor_ID],
    'VSSN': [VSSN],
    'padding': [padding],
    'MIC': [MIC],
    'Random_delay': [Random_delay],
    'Registration_ID': [Registration_ID],
    'Report_type': [Report_type],
    'Key_index': [Key_index],
    'Fragment_number': [Fragment_number],
    'Reserved': [Reserved],
    'Key_Fragment': [Key_Fragment],
    'completion_code': [completion_code],
    'activity_level': [activity_level],
})])

# 显示DataFrame
print(df)

print('======================')
print(df['ONU_ID'].iloc[0])
print(df['Message_type'].iloc[0])
print(df['SeqNo'].iloc[0])
print(df['Vendor_ID'].iloc[0])

使用pandas保存到Excel文件

from pandas import DataFrame
l1 = [1,2,3,4]
l2 = [1,2,3,4]
df = DataFrame({'序号': l1, '值': l2})
df.to_excel('test.xlsx', sheet_name='sheet1', index=False)

数据处理

把抓到的包放进 textEdit 里,然后获取再处理

data = self.ui.textEdit.toPlainText()  # 获取文本数据
packet_data = "".join(data.split())  # 去除全部空格
       
 # 将字符串每128个字符进行截取
packets = [packet_data[i:i + 128] for i in range(0, len(packet_data), 128)]
      if not packets:  # 如果packets列表为空,说明没有新的数据包,直接返回
           return

你可能感兴趣的:(python,Wireshark,抓包,二次开发插件,python,网络,开发语言)