在给设备 ota 升级时制作升级文件,会在工程生成的二进制文件头部加上一些升级信息,之前一直使用已经制作好的工具软件生成的。

要生成一个工具软件未支持的文件头,就得修改工具软件源码,重新编译工具软件(当然,也可以把工具软件做得更有扩展性一点),这无疑有点麻烦,尤其是在没有工具软件源码时。

要完成这么一个小功能,其实也不用那么复杂,使用一点 linux 中的几个命令即可。

以下1,2都是来自网络,仅作整理和备份。

  1. 将文本插入文件头

    1
    echo "hello world" | cat - fromFile > toFile
  2. 通过 echo 写二进制文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 方法1
    echo 000102030405 | xxd -r -ps > test
    # xxd 用于二进制或十六进制显示文件内容
    # -r 把 xxd 的十六进制输出内容转回原文件的二进制内容
    # -ps 以 postscript 的连续十六进制转储输出,这也叫做纯十六进制转储

    # 方法2
    echo -e -n "\x00\x01\x02\x03\x04\x05" > test
    # -e 表示使能反斜杠转义,\x 转义为十六进制
    # -n 不添加行尾换行标识,echo 默认会在末尾添加 0x0A
  3. 当然,处理完成后得再检查一下是否达到预期

    1
    2
    3
    # 1,使用 hex editor neo 软件直接对比源码是更加推荐的方式

    # 2,使用命令 diff 对比两个文件

通过看书,获取到两外两种向文件头插入行的方法:

  1. 使用 gawk 命令

    用 gawk 命令

    1
    gawk 'BEGIN {print "HELLO"};{print $0}' fromFile > toFile

    其中 BEGIN 关键字强制 gawk 在读取数据前执行 BEGIN 关键字后指定的程序脚本,即 {print "HELLO"}

  2. 使用 sed 命令

    1
    sed '1i\HELLO' fromFile > toFile

    使用 sed 的指定行的插入功能,其中参数 1i 表示在第一行前插入文本