我正在使用scapy在python中编写一个数据包差异工具,以查找两个pcap文件中的差异,然后以人类可读的格式输出差异。该脚本会根据个人情况比较每个数据包,并拆分不同的层/协议/ im-not-of-a-networking-guy对不起,可以单独进行比较。这就是我的两难困境的开始,您不知道存在哪些层,或者存在多少层,或者同一层是否存在多个层,或者两个数据包可能具有完全不同的层。我解决这些差异的计划是取出各层的名称,然后将这两个列表粉碎在一起,并使用该列表来了解我应该在这两个数据包中寻找的是哪种层。我不确定这是否是最好的解决方法,但是我能想到的就是它。如果您有更好的想法,请分享
tl;博士 我需要弄清楚如何将两个图层名称列表“合并”在一起,以便可以比较两个数据包
我尝试编写它,但是我无法完全得到想要的东西。然后我被告知,它看起来像是用python编写的c语言,并且使其变得更加pythonic,我完全理解。
def get_common_layers(layers_1, layers_2): # doesn't quite work
layers_total = []
i = 0
while i < len(layers_1):
temp_count = layers_1.count(layers_1[i])
if layers_1[i] not in layers_total:
if layers_1[i] not in layers_2:
layers_total.extend(layers_1[i:i + temp_count])
elif layers_1[i] in layers_2:
if temp_count >= layers_2.count(layers_1[i]):
layers_total.extend(layers_1[i:i + temp_count])
i = i + temp_count
i = 0
while i < len(layers_2):
temp_count = layers_2.count(layers_2[i])
if layers_2[i] not in layers_total:
if layers_2[i] not in layers_1:
layers_total.extend(layers_2[i:i + temp_count])
elif layers_2[i] in layers_1:
if temp_count >= layers_1.count(layers_2[i]):
layers_total.extend(layers_2[i:i + temp_count])
i = i + temp_count
return layers_total
这有点接近,但是有点不对劲。 很抱歉,我还无法真正解释我的意思,但是单元测试和所需的输入和输出应该能更好地显示图片。
所需的输入和输出:
layers_1 = ['Ether', 'UDP', 'DNS', 'DNSQR', 'DNSQR', 'DNSQR', 'DNSRR'],
layers_2 = ['Ether', 'TCP', 'DNS', 'DNSRR', 'DNSRR', 'DNSQR'])
layers_total = ['Ether', 'UDP', 'TCP', 'DNS', 'DNSQR', 'DNSQR', 'DNSQR', 'DNSRR', 'DNSRR']
unittest显示的错误的屏幕截图: https://imgur.com/UFi92jY.png“单元测试”
我要实际执行的操作的屏幕截图: https://imgur.com/eMZNX5V.png“ example_output”
(会显示图片,但有新帐户)
答案 0 :(得分:0)
您要查找两个列表的并集吗?这应该起作用:
layers_total = list(set(layers_1).union(set(layers_2)))