执行2个文件之间的模糊差异

时间:2017-05-05 19:32:59

标签: python diff

在进行一些反编译时,我有时需要比较2个MC68000反汇编的可执行文件(游戏是使用不同的语言发布或稍作修改)。

代码大致相同,但全局标签由于先前的代码更改而被移位(或者错误地将数据解释为分支,这些分支会生成或多或少的伪标签,具体取决于数据)所以我可以拥有第一个文件:

LAB_0012:
     MOVE  #0,D0
     MOVE  #2,D2
LAB_0013:
     RTS

和第二个文件:

LAB_0015:
     MOVE  #0,D0
     SUB   #3,D1
     MOVE  #2,D2
LAB_0016:
     RTS

如果我对两个文件执行差异,标签会加密/污染所需的结果,我希望在文件2中添加SUB #3,D1

所以我使用正则表达式进行了预处理,将所有标签更改为LAB_XXXX,如下所示:

def readlines(filepath):
    with open(filepath) as f:
        lines = list(f)
        return [x.rstrip() for x in lines],[r.sub("LAB_XXXX",l).partition(";")[0] for l in lines]

并使用difflib来打印差异,它有点有效,但当然不会恢复原始标签值。所以我保留原始数据,并解析difflib输出以尝试打印原始数据,但这是蹩脚的,并且不能很好地工作。

lines1,filtered_lines1 = readlines(file1)
lines2,filtered_lines2 = readlines(file2)

for line in difflib.unified_diff(filtered_lines1, filtered_lines2, fromfile=file1, tofile=file2, lineterm=''):
    m = re.match(r"@@..(\d+),(\d+).*(\d+),(\d+)",line)
    if m:
        start,end,start2,end2 = [int(x) for x in m.groups()]
        print(line)
        for i in range(start,start+end):
            print("{} <=> {}".format(lines1[i],lines2[i-start2+start]))

我已经检查了这个答案Fuzzy file diff,但这并不能解决这个问题:预处理这两个文件已经是我正在做的事情。

我想在比较时指示difflib(或任何其他diff意思)忽略此LAB_....正则表达式(有点像你可以比较数据忽略空格或不区分大小写),所以原始文件内容是在显示差异时打印(任何一方都会这样做)。对于我上面的例子,我想:

LAB_0015:
     MOVE  #0,D0
@@added:235,1@@   <== this is just an example: 1 line added at line 235
>     SUB   #3,D1
     MOVE  #2,D2
LAB_0016:
     RTS

我更喜欢将它保留在python中,但如果我必须对外部命令执行系统调用,那也没关系。

0 个答案:

没有答案