使用bash脚本从二进制Flash映像的末尾删除0xff

时间:2019-01-08 09:48:48

标签: bash makefile cygwin binaryfiles

我有一个工具可以生成要写入闪存的32MB二进制图像。 但是只有前2MB包含有价值的数据,其余仅为0xff。 因此,我想使用不错的bash / makefile脚本从文件末尾删除0xff字节。 我可以用头:

head -c 2M test.bin > out.bin

但是我不知道实际的长度,所以我想从文件末尾查找首次出现的0xff作为输入头或类似内容。

我正在cygwin上的Makefile中运行我的工具,因此,如果可以使用标准bash / makefile工具执行该工具,那就太好了。

3 个答案:

答案 0 :(得分:1)

此sed一个衬纸将仅在文件的最后一行运行,并删除所有结尾的0xFF字节。

sed '$ s/\xff*$//' file > file.out

答案 1 :(得分:1)

可以结合使用0xFF(或hexdumpxxd ...)来转换文件末尾的od字节数,以进行转换您的二进制文件放在ASCII十六进制值流中,并使用awk之类的文本处理器进行计数。示例:

hexdump -v -e '/1 "%02X\n"' test.bin | \
  awk '/FF/ {n += 1} !/FF/ {n = 0} END {print n}'

然后,可以使用以下方法从文件末尾删除该字节数: ddhead。示例:

head -c -$d test.bin > results/test.bin

总而言之,您的Makefile可能类似于:

OUTDIR  := results
OLDBINS := $(wildcard *.bin)
NEWBINS := $(addprefix $(OUTDIR)/,$(OLDBINS))

.PHONY: all

all: $(NEWBINS)

$(OUTDIR)/%: % | $(OUTDIR)
    n=$$(hexdump -v -e '/1 "%02X\n"' $< | \
      awk '/FF/ {n += 1} !/FF/ {n = 0} END {print n}'); \
    head -c -$$n $< > $@

$(OUTDIR):
    mkdir -p $@

有一些微妙之处,例如phony targetsall),automatic variables$<$@),order-only prerequisites({{ 1}}),在配方(| $(OUTDIR)符号中转义),制作函数($$wildcard),使用行连续的单行配方({{1 }}在行的末尾)...但是没有什么非常复杂的。

编辑:尝试找到更快的解决方案:

如果addprefix实用程序可用并且文件大小恰好是32MB,则另一个选项可能更有效(在我的超级简单测试中,对于32MB文件,速度大约是20倍):

  1. \-无需包装即可编码:

    base64
  2. 使用base64删除所有结尾的base64 -w0 字符串,然后在文件末尾删除最后一个sed(请参阅the base64 RFC 4648)以了解为什么使用这些字符串奇怪的结尾文字:

    ////
  3. //8=-解码:

    sed -E 's#(////)*//8=$##'
    

单线:

base64

请注意,这可能会在文件的末尾保留一个或两个base64 -d 字符,具体取决于输入文件的大小和尾随base64 -w0 test.bin | sed -E 's#(////)*//8=$##' | base64 -d > results/test.bin 字符的数量。新的制作配方为:

0xFF

答案 2 :(得分:0)

head -c -1 test.bin > out.bin

-1去除最后一个字节。