找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 185|回复: 11

[发布] binmay 优化版,二进制搜索替换命令工具

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
本帖最后由 2010hook 于 2026-6-30 18:01 编辑

原作者:Sean Loaring,Slore
原地址:https://github.com/slorelee/binmay

2026-06-30_175847.png

近期,DeepSeek 编程能力增强了,我借此审核并优化源码,主要优化项如下(欢迎反馈):

### 一、编译与可移植性修复

1. 移除不存在的类型转换
   原版 `f_malloc` 中有 `(struct input*)malloc(size)`,该结构体未定义,会导致编译错误。优化版改为泛型 `xmalloc` 直接返回 `void*`。

2. 修正头文件
   原版包含不标准的 `<sys/unistd.h>`,Windows 下找不到该文件。优化版已删除此依赖,代码纯 C 标准库即可编译。

3. 自定义 `getopt` 的返回值
   原版遇到非法选项时返回传入字符 `c`,可能干扰外部逻辑;优化版统一返回 `'?'`,符合 POSIX 惯例,并改进错误信息中显示程序名。

### 二、内存安全与资源管理

4. 消除内存泄漏
   原版所有 `f_malloc` 分配的对象(文件句柄、缓冲区、掩码结构等)均未释放。优化版引入 `cleanup` 统一释放路径,添加 `file_handle_free`、`buffered_handle_free` 等函数,确保资源被回收。

5. 修复符号扩展 bug
   原版 `masked_replace` 中直接对 `char` 做 `~` 操作,在 `char` 为有符号的平台上会先提升为 `int`,导致错误的符号位扩展。优化版先转换为 `unsigned char`,再参与位运算,确保掩码合并的正确性。

6. 备份文件名截断防护
   原版使用 `strcat(fname, ".org")` 并直接 `rename`,若原始文件名长度接近 `BUF_LEN`,拼接后的备份文件名可能溢出。优化版改为 `snprintf` 并预先检查长度,超长时提前报错。

### 三、错误处理增强

7. 函数返回值规范化
   原版大量函数调用 `exit(1)` 或 `abort()` 直接终止。优化版中 `file_handle_setfile`、`masked_string_setstr`、`process_string` 等关键函数返回错误码(-1 或非零),由上层统一处理并跳转至 `cleanup`,程序能以受控方式退出并释放资源。

8. 错误退出码一致性
   原版很多失败路径虽打印了错误信息,但 `main` 依旧返回 0。优化版确保所有 `goto cleanup` 前设置了 `retcode = EXIT_FAILURE`,批处理脚本能准确通过 `%ERRORLEVEL%` 判断成败。

9. I/O 错误全面检查
   原版多处 `fwrite`、`fread` 仅检查是否返回 1(逻辑错误),优化版使用“读写字节数是否等于期望”的方式,并检查 `ferror`,明确区分 EOF 和错误。

10. 空搜索串保护
    优化版在 `masked_string_ensuremask` 中增加 `length == 0` 检查,防止因空搜索串导致死循环或逻辑混乱。

### 四、代码结构与可维护性

11. 全局变量局部化
    原版 `verbose`、`UseBinaryP` 等为外部可见全局变量;优化版改为 `static` 文件作用域,消除符号冲突风险。

12. 函数声明全部静态化
    原版存在大量未实现的全局函数声明;优化版仅保留 `getopt` 为外部可见,其余均用 `static`,并提供完整实现,清晰界定接口。

13. 移除未使用函数
    删除了 `open_outfile`、`flush_outbuf`、`b_getchar` 等残留声明,代码更简洁。

14. 增加 `own_file` 标志
    文件句柄增加 `own_file` 字段区分我们打开的文件与 `stdin`/`stdout`,防止 `fclose` 误关标准流。

15. `main` 函数结构化
    使用 `goto cleanup` 模式统一资源释放,避免重复代码,降低维护出错可能。

### 五、功能增强与细节改进

16. 缓冲区大小提升
    `BUF_LEN` 从 1024 提升至 8 KB,`BLOCK_LEN` 从 1024 提升至 128 KB,大幅减少大文件处理的 I/O 调用次数,提升性能。

17. 帮助文本增强
    明确标注大小写不敏感搜索限于 ASCII 字符(`(ASCII only)`),避免误解。

18. 文本格式说明更清晰
    在帮助中补充了 `UTF-16LE` 等关键词,方便用户理解 `u:`/`U:` 格式的实际意义。

19. 修复原版未初始化行为
    优化版通过 `xmalloc` 分配对象后设置默认值(如 `masklength = -1`),确保逻辑完整性,避免依赖未初始化内存。

---

### 总结
最终优化版修复了所有已知的编译错误、内存泄漏、符号位 bug 和错误处理缺陷,代码安全、健壮且易维护。在保持原版全部功能的同时,提升了性能和大文件处理的可靠性。

binmay.7z

24.33 KB, 下载次数: 18, 下载积分: 无忧币 -2

TinyCC 编译

发表于 3 小时前 | 显示全部楼层
感谢分享,赞~
回复

使用道具 举报

发表于 3 小时前 来自手机 | 显示全部楼层
感谢分享辛苦了
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
最近接触最多的是 dUP 的搜索替换功能。它可以使用 ?? 代表通配符,而且可以是间断的。
例如:以其他字节为依据,将 DD 替换为 XX
AA BB ?? DD ?? FF -> ?? ?? ?? XX ?? ??

点评

发出来给我试试  发表于 1 小时前
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
功能强大的工具。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
压缩包内的 binmay.exe 和 binmay2.exe
啥区别
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
另外编译的,都是64位版本,,是否也提供下32位版本的
回复

使用道具 举报

发表于 1 小时前 来自手机 | 显示全部楼层
谢谢分享binmay 优化版,二进制搜索替换命令工具
回复

使用道具 举报

发表于 半小时前 | 显示全部楼层
本帖最后由 chishingchan 于 2026-6-30 20:53 编辑

7.png

搜索模式中的字符也可以用通配符 ?? 来代替!
替换模式中自动将搜索模式中相同的字节使用 ?? 来代替。
回复

使用道具 举报

发表于 半小时前 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-6-30 21:37

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表