前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二进制文件处理之尾部补0和尾部去0

二进制文件处理之尾部补0和尾部去0

作者头像
zqb_all
修改2020-04-06 17:23:14
2K0
修改2020-04-06 17:23:14
举报
文章被收录于专栏:QB杂货铺QB杂货铺

背景

有时候我们需要在某个二进制文件的尾部增加一些字节,使文件大小对齐到某个边界,以便满足某些操作的需求。例如某个文件下一步的写入操作需要块对齐。

有时候我们需要将某个二进制文件尾部的大量十六进制0字节去除。例如某工具生成的文件系统镜像,实际包含的有效数据不多,但尾部默认用0填充到了整个文件系统大小,此时会想将其尾部的0去掉以加快烧录。

尾部补0

可以使用dd来完成。dd支持conv参数,conv指定sync,则可将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

代码语言:txt
复制
  sync      pad every input block with NULs to ibs-size; when used
            with block or unblock, pad with spaces rather than NULs

例如

代码语言:txt
复制
zqb-all-PC:~$ echo "https://www.cnblogs.com/zqb-all/" > demo

zqb-all-PC:~$ dd if=demo of=demo_align bs=512 conv=sync
记录了0+1 的读入
记录了1+0 的写出
512 bytes copied, 0.000572995 s, 894 kB/s

zqb-all-PC:~$ du -b demo demo_align
33  demo
512 demo_align

zqb-all-PC:~$ hexdump -C demo ;hexdump -C demo_align
00000000  68 74 74 70 73 3a 2f 2f  77 77 77 2e 63 6e 62 6c  |https://www.cnbl|
00000010  6f 67 73 2e 63 6f 6d 2f  7a 71 62 2d 61 6c 6c 2f  |ogs.com/zqb-all/|
00000020  0a                                                |.|
00000021
00000000  68 74 74 70 73 3a 2f 2f  77 77 77 2e 63 6e 62 6c  |https://www.cnbl|
00000010  6f 67 73 2e 63 6f 6d 2f  7a 71 62 2d 61 6c 6c 2f  |ogs.com/zqb-all/|
00000020  0a 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200

尾部去0

可以使用sed来完成,替换掉最后一行的末尾的0即可

代码语言:txt
复制
sed '$ s/\x00*$//'  源文件  >  新文件

例如

代码语言:txt
复制
zqb-all-PC:~$ sed '$ s/\x00*$//' demo_align > demo_cut

zqb-all-PC:~$ du -b demo_align demo_cut
512 demo_align
33  demo_cut

zqb-all-PC:~$ hexdump -C demo_align;hexdump -C demo_cut
00000000  68 74 74 70 73 3a 2f 2f  77 77 77 2e 63 6e 62 6c  |https://www.cnbl|
00000010  6f 67 73 2e 63 6f 6d 2f  7a 71 62 2d 61 6c 6c 2f  |ogs.com/zqb-all/|
00000020  0a 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200
00000000  68 74 74 70 73 3a 2f 2f  77 77 77 2e 63 6e 62 6c  |https://www.cnbl|
00000010  6f 67 73 2e 63 6f 6d 2f  7a 71 62 2d 61 6c 6c 2f  |ogs.com/zqb-all/|
00000020  0a                                                |.|
00000021

20200406更新:本方法对大文件不适用,请参考:cut-trailing-bytes:二进制尾部去0小工具

其他

如果不是0x00,是其他的怎么处理?

尾部去0xFF,从尾部去0命令可以看出,其实是可以很方便地改成成去掉其他的字符

代码语言:txt
复制
sed '$ s/\xFF*$//'  源文件  >  新文件

尾部补全对齐0xFF,这个暂时没有想到很简单方式。搜了下,找到了 https://superuser.com/questions/274972/how-to-pad-a-file-with-ff-using-dd# 但感觉还不够好。

本文链接:https://cloud.tencent.com/developer/article/1560527

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 尾部补0
  • 尾部去0
  • 其他
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档