如何判断两个AutoHotkey Buffer是否相等?现有NumGet实现求更优解
检查AutoHotkey中两个Buffer内容是否相等的简便方法
我需要检查两个已加载到AutoHotkey Buffer中的二进制文件内容是否一致,未找到直接判断两个Buffer相等的方法,于是用NumGet实现了以下BufferEqual函数:
BufferEqual(Buf1, Buf2) { if Buf1.Size != Buf2.Size { return False } Int64Chunks := Buf1.Size // 8 Int8Chunks := Mod(Buf1.Size, 8) Loop Int64Chunks { Chunk1 := NumGet(Buf1, (A_Index - 1) * 8, "Int64") Chunk2 := NumGet(Buf2, (A_Index - 1) * 8, "Int64") if Chunk1 != Chunk2 { return False } } Loop Int8Chunks { Chunk1 := NumGet(Buf1, Int64Chunks * 8 + A_Index - 1, "Char") Chunk2 := NumGet(Buf2, Int64Chunks * 8 + A_Index - 1, "Char") if Chunk1 != Chunk2 { return False } } return True }
请问是否存在更简便的实现方式?
更简便的实现方案:调用系统原生memcmp函数
直接通过DllCall调用Windows系统的memcmp函数是最简便且高效的方式,该函数专门用于比较两块内存区域的内容,比手动循环判断性能更优,尤其适合大尺寸的Buffer:
BufferEqual(Buf1, Buf2) { ; 先判断尺寸是否一致,尺寸不同直接返回不相等 if Buf1.Size != Buf2.Size return false ; memcmp返回0表示两块内存内容完全一致 return DllCall("msvcrt.dll\memcmp", "Ptr", Buf1, "Ptr", Buf2, "UInt", Buf1.Size, "Cdecl Int") = 0 }
说明:
memcmp是C标准库函数,通过msvcrt.dll调用,无需额外依赖- 函数参数依次为:第一个Buffer的指针、第二个Buffer的指针、要比较的字节数
- 返回值为0时说明内容完全相等,返回非0值则表示存在差异
不推荐的方案:转字符串比较
不要尝试用StrGet将Buffer转为字符串后比较,因为二进制内容中可能包含null字符(ASCII值0),StrGet会在遇到null时截断字符串,导致比较结果不准确。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

