Подсчет количества 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 $@
Существует несколько тонкостей, таких как фальшивые цели (all
), автоматические переменные ($<
, $@
), предпосылки только для заказа (| $(OUTDIR)
), расширение раскрытия в рецептах (знаки $$
), создание функций (wildcard
, addprefix
), однострочный рецепт, использующий продолжение строки (\
в конце линий) ... но ничего сложного.
РЕДАКТИРОВАТЬ : попытаться найти более быстрое решение:
Другой вариант может быть более эффективным (примерно в 20 раз быстрее для файлов 32 МБ в моих супер-простых тестах), если доступна утилита base64
и размер ваших файлов ровно 32 МБ:
base64
- код без переноса:
base64 -w0
Используйте sed
, чтобы удалить все завершающие строки ////
, за которыми следует последняя //8=
в конце файла (см. base64
RFC 4648 ), чтобы понять, почему эти странные конечные тексты:
sed -E 's#(////)*//8=$##'
base64
-decode:
base64 -d
One-вкладыш:
base64 -w0 test.bin | sed -E 's#(////)*//8=$##' | base64 -d > results/test.bin
Обратите внимание, что это может оставить один или два символа 0xFF
в конце файла, в зависимости от размера входного файла и количества конечных символов 0xFF
. Новый рецепт изготовления будет:
$(OUTDIR)/%: % | $(OUTDIR)
base64 -w0 $< | sed -E 's#(////)*//8=$$##' | base64 -d > $@