中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 二进制方式处理文件工具 STR (2020.11.16 更新)
« [1] [2] [3] [4] [5] »
作者:
标题: 二进制方式处理文件工具 STR (2020.11.16 更新) 上一主题 | 下一主题
19951001
高级用户

流落街头



积分 570
发帖 272
注册 2005-10-17
来自 北京
状态 离线
『楼 主』:  二进制方式处理文件工具 STR (2020.11.16 更新)

STR [File] [Start] [Bytes] [/C|/I] [dstFile] [Address]
         File: A File to be Processed data.  //文件
        Start: Offset to Process data.  //文件中处理数据的起始位置  (文件的开头位置为0)
        Bytes: Bytes to Process. //要处理的字节数量 (如果输入0,则表示从Start开始到文件末尾)
           /C: Copy Bytes from File to dstFile.  //从源文件向目标文件复制数据
           /I: Insert Bytes to dstFile from File. //从源文件向目标文件插入数据,插入数据后目标文件增加 Bytes个字节
      dstFile: A File to Write Result data.  //目标文件
      Address: Offset to Write Result data.  //目标文件中要复制或插入数据的位置 (如果目标文件不存在,该值被忽略)

STR [File] [Start] [Bytes] [/D] [dstFile]
           /D: Delete Bytes from File & Write Result to dstFile.  //从源文件删除数据并结果写入目标文件

STR [File] [Start] [Bytes] [/V] [/A] [/P]
           /V: View File In Hex Style.  //十六进制方式查看文件
           /A: Show ASCII Value. //显示ASCII码
           /P: Pause Echo Screen.  //满屏暂停

STR [File] [Start] [Bytes] [/F] [/Hex|/Asc]:[Value] [/I] [/A]
        Bytes: Must be 0.  //必须为0
             /F: Find String in File.  //在文件中查找字符串
         /Hex: Hex Style. //十六进制方式
         /Asc: ASCII Style.  //ASCII码方式
        Value: Hex_Digital/ASCII String (40 Characters Maximum).  //字符传真的值,最长40个字符 (如果是十六进制串长度应为双数)
           /I: Ignore Case. //忽略大小写
           /A: Process All Value in File. //在文件中查找所有满足要求的字符串(默认查找1次)

STR [File] [Start] [Bytes] [/E] [/Hex|/Asc]:[Value]
        Bytes: Must be 0.  //必须为0
           /E: Edit File.  //编辑文件

STR [File] [Start] [Bytes] [/R] [SrcString] [DstString] [/I] [/A]
        Bytes: Must be 0.  //必须为0
           /R: Relace SrcString with DstString.  //字符常替换
    SrcString: [/Hex|/Asc]:[Value].   //源串,可以使用十六进制或ASCII码串
    DstString: [/Hex|/Asc]:[Value].  //目标串,可以使用十六进制或ASCII码串
           /A: Process All SrcString in File.  //在文件中查找所有源字符串(默认替换1次)

说明:
    1  使用 /C 和 /I 命令时,如果目的文件不存在,Adress 的值将被忽略,直接执行将源文件从 Start 开始的 Bytes 个字节写入到新创建的目的文件中
     2  使用 /C 和 /I 命令时,如果目的文件存在,并且不输入 Address,则Address 默认为0,也就是文件的起始位置。
     3 目前处理的单个文件大小不超过 2G

例子:

str  1.exe 0x100  0x10 /d 2.bin  执行将文件1.exe 从位置256开始的16个字节删除,并将结果写入到2.bin,文件2.bin的长度将比1.exe长度小16
str  1.exe 0x100  0x10 /c 2.bin 20  执行将文件1.exe 从位置256开始的16个字节写入到2.bin的20位置,也就是文件2.bin从位置20开始的16字节被覆盖
str  1.exe 0x100  0x10 /i 2.bin 20  执行将文件1.exe 从位置256开始的16个字节插入到2.bin的20位置,结果文件2.bin的长度将增加16字节

str  1.exe 0x100  0 /v /p /a  从文件偏移位置256开始在屏幕上显示文件内容,如果Bytes输入为0,则表示从Start开始至文件末尾。

str  1.exe 0x100  0 /e /hex:11223344  将文件偏移位置256开始的4个字节修改为,0x11,0x22,0x33,0x44。
str  1.exe 0x100  0 /e /asc:1234  将文件偏移位置256开始的4个字节修改为,1234, 也就是0x31,0x32,0x33,0x34

查找替换算法使用的是 KMP 算法,不重复计数,如文件 1.txt 的内容为10个字符0:
0000000000

如执行命令: str 1.txt 0 0 /f /asc:0000 /a
则执行结果为:
   Find string At:
                   0  0x0
                   4  0x4

不会是:
   Find string At:
                   0  0x0
                   1  0x1
                   2  0x2
                   3  0x3
                   4  0x4
                   5  0x5
                   6  0x6


压缩包中包含DOS版本和Win32版本

2008.12.14 修正替换字符串功能中存在的问题


2008.12.19 修正19楼存在问题

2009.2.15 测试版本在50楼

[ Last edited by 19951001 on 2020-11-16 at 17:01 ]

附件 1: str.rar (2008-12-19 22:27, 18.38 K, 下载附件所需积分 1 点 ,下载次数: 168)
附件 2: strWin32.rar (2020-11-16 17:00, 20.34 K,下载次数: 5)
2008-4-26 21:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
cchessbd
高级用户





积分 525
发帖 222
注册 2006-8-28
状态 离线
『第 2 楼』:  

可能这个东西我用不到,但是我需要一个DOS下查找替换文件中的某个字符串的工具……

不知道 19950101兄能否帮忙写一个?

比如: XXX /rN file "12345,d" "54321,g"

查找到才替换,或替换一次就退出。
替换所有 /r  N次 /rN

此文件可能会有 3~10 M

[ Last edited by cchessbd on 2008-4-28 at 05:39 PM ]

2008-4-28 17:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
19951001
高级用户

流落街头



积分 570
发帖 272
注册 2005-10-17
来自 北京
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by cchessbd at 2008-4-28 17:29:
可能这个东西我用不到,但是我需要一个DOS下查找替换文件中的某个字符串的工具……

不知道 19950101兄能否帮忙写一个?

比如: XXX /rN file "123 ...

只需要对文本文件处理吗?

2008-5-7 22:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
19951001
高级用户

流落街头



积分 570
发帖 272
注册 2005-10-17
来自 北京
状态 离线
『第 4 楼』:  

2008.11.14 更新

2008-11-14 21:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
本是
银牌会员





积分 2201
发帖 789
注册 2005-1-27
状态 离线
『第 5 楼』:  

好工具,但.rar 解压时报错:文件"WIN"头被损坏!
请重新上传!!!



my major is english----my love is dos----my teacher is the buddha----my friends--how about U
2008-11-15 00:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
雨露
管理员

DOS非常爱好者


积分 6209
发帖 2598
注册 2006-1-20
状态 离线
『第 6 楼』:  

报错后win32文件夹是空的!



2008-11-15 08:07
查看资料  发短消息 网志  OICQ (156647374)  编辑帖子  回复  引用回复
本是
银牌会员





积分 2201
发帖 789
注册 2005-1-27
状态 离线
『第 7 楼』:  

文件WIN在根目录。



my major is english----my love is dos----my teacher is the buddha----my friends--how about U
2008-11-15 11:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
19951001
高级用户

流落街头



积分 570
发帖 272
注册 2005-10-17
来自 北京
状态 离线
『第 8 楼』:  

已经修复破损的压缩包

2008-11-15 11:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
chishingchan
银牌会员




积分 1282
发帖 538
注册 2002-11-2
状态 离线
『第 9 楼』:  

因需修改二进制文件,这种小软件我以前寻找过,只找到纯DOS下的FH,现在这个应该不错。

2008-11-24 21:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
goli2008
中级用户





积分 252
发帖 97
注册 2006-9-17
状态 离线
『第 10 楼』:  

坚决支持,!!
找了好久,请楼主将标题改改,可好,方便其他人搜索,谢谢!

2008-12-13 11:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 11 楼』:  

好东西,收下了,谢谢!



QQ:366840202
http://chenall.net
2008-12-13 18:10
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 12 楼』:  

可不可以再加个功能"字符转义"
比如\0 就是ASCII码00
比如
strw test.bin 0x10 0 /e /asc:test\13\0
会写入test和0X0D和0X00



QQ:366840202
http://chenall.net
2008-12-13 19:10
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
19951001
高级用户

流落街头



积分 570
发帖 272
注册 2005-10-17
来自 北京
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by chenall at 2008-12-13 19:10:
可不可以再加个功能"字符转义"
比如\0 就是ASCII码00
比如
strw test.bin 0x10 0 /e /asc:test\13\0
会写入test和0X0D和0X00

理论上可以实现,不过我近些日子比较忙,暂时没有时间修改


其实也可以这样实现
strw test.bin 0x10 0 /e /asc:test
strw test.bin 0x14 0 /e /hex:1300
上述两条命令可以实现你要的功能

[ Last edited by 19951001 on 2008-12-13 at 23:18 ]

2008-12-13 22:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 14 楼』:  

嗯,上面是可以实现,只是如果放在批处理里面要计算字符长度会比较麻烦.

另一个问题,不知程序有没有返回errorleve值?
比如查找,成功返回?失败返回?



QQ:366840202
http://chenall.net
2008-12-14 09:43
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 15 楼』:  

查找替换功能好像有些问题..
文件A.TXT内容
Exe =$1\TEST
Exe =$1\TEST2
strw a.txt 0 0 /r /asc:$1 /asc:j: /a
得到的结果为乱码,而且丢失字符

正确的结果
Exe =J:\TEST
Exe =J:\TEST2




QQ:366840202
http://chenall.net
2008-12-14 10:14
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: