如何用批处理文件从hex文件中读取具体的内存地址值?

问题描述 投票:0回答:1

我想要十六进制文件中的一个内存地址值,我想将它与我知道的值进行比较,并想知道该值是否匹配。

我尝试将一个内存地址与预期值进行比较,但我觉得脚本有问题,我无法获得正确的输出并打印实际值-->>>>

@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
batch-file text-files command-prompt batch-processing hexdump
1个回答
0
投票

提示/观察:

始终使用

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

© www.soinside.com 2019 - 2024. All rights reserved.