Batch file 我如何编写这个脚本来创建一个有细微差别的文件?

Batch file 我如何编写这个脚本来创建一个有细微差别的文件?,batch-file,hex,command-prompt,Batch File,Hex,Command Prompt,我正在尝试编写一个简单的.bat脚本,它将帮助我创建一些在工作中测试所需的文件。基本上,这些文件大约有15000行,都包含一组十六进制值。我需要的是该文件找到一个特定的值并对其进行轻微更改。我需要它通过在字节地址0x80020304上加1,然后从该行末尾减去1来查找和更改字节地址0x80020304 例如,它会找到那个字节地址,还有这段代码 S325800202E0000000000000000000000000000000000000000000000076 S3258002030000000

我正在尝试编写一个简单的.bat脚本,它将帮助我创建一些在工作中测试所需的文件。基本上,这些文件大约有15000行,都包含一组十六进制值。我需要的是该文件找到一个特定的值并对其进行轻微更改。我需要它通过在字节地址0x80020304上加1,然后从该行末尾减去1来查找和更改字节地址0x80020304

例如,它会找到那个字节地址,还有这段代码

S325800202E0000000000000000000000000000000000000000000000076 S3258002030000000000D78B21E60800000000000202801B0280000802801F4F0280000038044 S32580020320FF038000004800FF04800000580FF058000006801F068000078015

会变成这样吗

S325800202E0000000000000000000000000000000000000000000000076 S3258002030000000000D88B21E60800000000000202801B0280000802801F4F0280000038043 S32580020320FF038000004800FF04800000580FF058000006801F068000078015

记住,在十六进制中,每个字节地址是2个字符。所以你把1加到D7上,它变成了D8,在这行的末尾,44减去1,变成了43。如果最后的数字是40,就必须变成3F

我一点也不知道该怎么做。我真正知道的是如何设置输入和输出文件,但是当涉及到操作输出文件时,我不是很了解。此外,我也不知道它将如何改变,因为我与十六进制工作

提前感谢您提供的任何帮助。非常感谢

@ECHO关闭
SETLOCAL
设置/p“infle=Filename?”
(
对于/f“usebackqtokens=1*delims=“%%a IN”(“%infle%”)DO(
如果定义了填充(调用:进程%%a
)其他(回声(%%a)
)
)>newfile.txt
后藤:EOF
:进程
设置行=%1
如果不是%line:~0,12%==S32580020300回波%line%&GOTO:EOF
设置“infle=”
::增量nybble 21(计数从0开始)
通话:inc%线路:~21,1%
::构建字节
设置b1=%line:~20,1%%rep%
::若替换为0,那个么增量为F->0,所以增量为incr.prev.nyble
如果%rep%==0(调用:inc%行:~20,1%)其他(转到decb2)
设置b1=%rep%%b1:~-1%
:decb2
::重复上述步骤,但在最后2个Nybles上递减。
呼叫:12%行:~-1%
::构建字节
设置b2=%line:~-2,1%%rep%
::如果替换为F,则减量为0->F,因此减量为prev.nyble
如果%rep%==F(调用:十二月%line:~-2,1%)其他(转到重建)
设置b2=%rep%%b2:~-1%
:重建
设置行=%line:~0,20%%b1%%行:~22,-2%%b2%
回音%行%
后藤:eof
:公司
设置rep=0
对于(F E D C B a 9 8 7 6 5 4 3 2 1 0)中的%%a,如果%%a==%1(转到:eof)则执行其他操作(集合代表=%a)
:十二月
集合rep=F
对于(0 1 2 3 4 5 6 7 8 9 a B C D E F)中的%%a,如果%%a==%1(转到:eof)则执行其他操作(集合代表=%a)
我使用了一个名为
q23015544.txt
的文件,其中包含用于测试的数据。 生成newfile.txt

批处理中的子字符串是从
%var:~m,n%
中获取的,其中
,n
是可选的;
m
是从字符串开头开始的字符数,如果是负值,则从结尾开始。
,n
正值=返回的最大长度;负值=从结尾开始的字符中的结束位置;缺少=返回
m

因此,批处理首先查找目标行-它以指示的12个字符字符串开始。任何其他行,它都会简单地吐出。对于目标行,它选择最不重要的Nyble,并调用例程来递增或递减该Nyble,如果有结转,则重复该操作(由
rep
中的替换字符检测,变为
0
表示增量或
F
表示减量)

然后只需重建线路并将其输出即可

结构

(commands...)>file
使任何数据
回显
出现在新创建的文件中-即使
回显
出现在调用的子例程中


我编辑了批处理以解决速度问题,并允许输入文件名,但我没有测试更改

您可以使用
set/p..
输入文件名或

set "infile=%~1"
接受文件名作为批处理参数(即批处理文件的参数)

另一个更改是在检测到目标行时清除'infle'的值。Batch将已经知道要读取哪个文件,然后在循环中检测到环境中缺少
infle
,因此将输出原始行-它根本不会调用子例程。这将大大加快速度


小溪!神奇的单词

@ECHO关闭
SETLOCAL
设置“infle=Filename?”
设置“行=”
对于/f“usebackqdelims=““%infle%”中的%%a”执行调用:处理%%a&如果定义行转到下一步
未找到回显目标&转到:eof
:下一步
sed s/%original%/%line%/g“%infle%”newfile.txt
后藤:EOF
:进程
设置原始值=%1
如果不是%原始:~0,12%==S32580020300转到:EOF
设置行=%1
::增量nybble 21(计数从0开始)
通话:inc%线路:~21,1%
::构建字节
设置b1=%line:~20,1%%rep%
::若替换为0,那个么增量为F->0,所以增量为incr.prev.nyble
如果%rep%==0(调用:inc%行:~20,1%)其他(转到decb2)
设置b1=%rep%%b1:~-1%
:decb2
::重复上述步骤,但在最后2个Nybles上递减。
呼叫:12%行:~-1%
::构建字节
设置b2=%line:~-2,1%%rep%
::如果替换为F,则减量为0->F,因此减量为prev.nyble
如果%rep%==F(调用:十二月%line:~-2,1%)其他(转到重建)
设置b2=%rep%%b2:~-1%
:重建
设置行=%line:~0,20%%b1%%行:~22,-2%%b2%
后藤:eof
:公司
设置rep=0
对于(F E D C B a 9 8 7 6 5 4 3 2 1 0)中的%%a,如果%%a==%1(转到:eof)则执行其他操作(集合代表=%a)
:十二月
集合rep=F
对于(0 1 2 3 4 5 6 7 8 9 a B C D E F)中的%%a,如果%%a==%1(转到:eof)则执行其他操作(集合代表=%a)

这个版本应该堆得更快,但它依赖于第三方产品
SED
。我使用GNUSED-谷歌是你的朋友。

瑞士文件刀有以下选项,如果它有帮助的话:
生成随机文件-使用随机数据创建文件
,等等