我有一个工具可以生成要写入闪存的32MB二进制图像。 但是只有前2MB包含有价值的数据,其余仅为0xff。 因此,我想使用不错的bash / makefile脚本从文件末尾删除0xff字节。 我可以用头:
head -c 2M test.bin > out.bin
但是我不知道实际的长度,所以我想从文件末尾查找首次出现的0xff作为输入头或类似内容。
我正在cygwin上的Makefile中运行我的工具,因此,如果可以使用标准bash / makefile工具执行该工具,那就太好了。
答案 0 :(得分:1)
此sed一个衬纸将仅在文件的最后一行运行,并删除所有结尾的0xFF
字节。
sed '$ s/\xff*$//' file > file.out
答案 1 :(得分:1)
可以结合使用0xFF
(或hexdump
,xxd
...)来转换文件末尾的od
字节数,以进行转换您的二进制文件放在ASCII十六进制值流中,并使用awk
之类的文本处理器进行计数。示例:
hexdump -v -e '/1 "%02X\n"' test.bin | \
awk '/FF/ {n += 1} !/FF/ {n = 0} END {print n}'
然后,可以使用以下方法从文件末尾删除该字节数: dd
或head
。示例:
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 targets(all
),automatic variables($<
,$@
),order-only prerequisites({{ 1}}),在配方(| $(OUTDIR)
符号中转义),制作函数($$
,wildcard
),使用行连续的单行配方({{1 }}在行的末尾)...但是没有什么非常复杂的。
编辑:尝试找到更快的解决方案:
如果addprefix
实用程序可用并且文件大小恰好是32MB,则另一个选项可能更有效(在我的超级简单测试中,对于32MB文件,速度大约是20倍):
\
-无需包装即可编码:
base64
使用base64
删除所有结尾的base64 -w0
字符串,然后在文件末尾删除最后一个sed
(请参阅the base64
RFC 4648)以了解为什么使用这些字符串奇怪的结尾文字:
////
//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去除最后一个字节。