You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:28:31