我想要十六进制文件中的一个内存地址值,我想将它与我知道的值进行比较,并想知道该值是否匹配。
我尝试将一个内存地址与预期值进行比较,但我觉得脚本有问题,我无法获得正确的输出并打印实际值-->>>>
@echo off
REM Set the path to the hex file
set HEX_FILE="hex.hex"
REM Specify the memory address to check (in decimal)
set ADDRESS=A400
REM Specify the expected value in hexadecimal format
set EXPECTED_VALUE= 20A0E3EB
REM Convert the address to hexadecimal
set /a "ADDRESS_HEX=%ADDRESS%"
REM Read the value at the specified address from the hex file
for /f "tokens=2 delims=: " %%a in ('certutil -f -dump %HEX_FILE% ^| findstr /b /c:"%ADDRESS_HEX%:"') do (
set VALUE=%%a
)
REM Remove leading spaces from the value
set "VALUE=%VALUE:=%"
REM Compare the actual value with the expected value
if "%VALUE%"=="%EXPECTED_VALUE%" (
echo The value at address %ADDRESS% in file %HEX_FILE% is correct: %VALUE%
) else (
echo The value at address %ADDRESS% in file %HEX_FILE% is incorrect. Expected: %EXPECTED_VALUE%, Actual: %VALUE%
)
pause
提示/观察:
始终使用
setlocal
风味以避免环境混乱。通常,setlocal
线应该跟随 @echo off
使用
set "var=value"
设置字符串值 - 这可以避免尾随空格引起的问题。不要分配 "
或终端反斜杠或空格。从元素构建路径名 - 与直觉相反,它可能会使过程变得更容易。如果使用语法 set var="value"
,则引号将成为分配值的一部分。
因此,
set "HEX_FILE=hex.hex"
和
…certutil -f -dump "%HEX_FILE%" …
ADDRESS=A400
- 该值是十六进制,而不是前一行注释中提到的十进制。
EXPECTED_VALUE= 20A0E3EB
- 空间包含在分配的值中。
set /a "ADDRESS_HEX=%ADDRESS%"
- 在您发布的代码中,address
已经是十六进制。如果它是十进制,则需要转换为十六进制,这将涉及使用循环构建字符串以提供适当的半字节。请注意,批量小数仅限于 31
位;您似乎想要处理 32
。
set "VALUE=%VALUE:=%"
不正确; set "VALUE=%VALUE: =%"
将从变量中删除所有空格(:
和 =
之间的字符串)。
if "%VALUE%"=="%EXPECTED_VALUE%" (
:您正在尝试从 VALUE
中删除空格,但如前所述,EXPECTED_VALUE
包含前导空格,因此此比较将始终解析为 FALSE
。