【问题标题】:Trying to parse packets in Python and struggling to build a proper script尝试在 Python 中解析数据包并努力构建正确的脚本
【发布时间】:2020-06-14 08:04:49
【问题描述】:

我有一个巨大(如 600MB)的数据包捕获文件,格式如下:

[S->C][02][0x5A97BE]
[0047F32B] 95 DE 5E 52 4A F3 80 F5 47 18 97 70 10 EE 5B E5  ..^RJ...G..p..[.
           7C E8 F5 B2 2F 1F 3A 6B A1 8F 6C 73 65 A6 42 27  |.../.:k..lse.B'

我的目标是减少整个事情,使其看起来像这样:

[S->C][02][0x5A97BE]
95DE5E524AF380F54718977010EE5BE57CE8F5B22F1F3A6BA18F6C7365A64227

我浏览了一些 string.split() 和 regex 教程,但似乎没有一个能让我明白。基本上,我正在尝试创建一个 if 语句,检查该行是否包含 [S->C] 或在第四个字符位置有一个“>”。如果是这样,请跳过行。然后我想删除第一个空格左侧的所有内容和双空格右侧的所有内容(十六进制和 ascii 显示之间有一个双空格。)

我现在已经遵循了 3 个教程,修改了它们,但无法正确解析。任何帮助都会很棒。我知道这并不太难,但由于某种原因,我无法理解。

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: python parsing packet


【解决方案1】:

这是一种方法。将输入文件传递为myfun(input_file)

def myfun(in_file):
    header = True
    # Get the meat, remove newlines.
    reg1 = re.compile(r'^.{11}(.{47}).*\n')
    # Remove spaces.
    reg2 = re.compile(r' ')
    with open(in_file) as f:
        for line in f:
            if header:
                # Print the header.
                print(line, end='')
                header = False
            else:
                # Print the body.
                print(reg2.sub('', reg1.sub('\g<1>', line)), end='')
    # Append a newline.
    print()
    return

【讨论】:

  • 非常感谢,它正是我所需要的!我想我真的需要更好地处理正则表达式。
  • 不客气。有一个正则表达式可以消除 if n==0... 部分,但我不确定它是否更好,因为它更难理解,而且计算成本可能更高。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2017-02-25
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
相关资源
最近更新 更多