разделить (нарезать?) двоичный файл на произвольное количество сегментов разных заранее определенных размеров за одно чтение, используя bash - PullRequest
1 голос
/ 06 марта 2020

Иногда двоичные файлы имеют форматы, которые согласованы «ранее» и имеют сегменты двоичных данных, которые имеют независимое значение. Например, двоичный файл может иметь структуру

{4 bytes of ID}{20 bytes of data}{4 bytes of checksum}

Я хочу разбить / нарезать (не знаю, какое слово лучше) такой двоичный файл в bash, выполняя одно чтение с произвольным номером размеры сегментов. Любая идея, как это сделать?

Примечание 1 : я знаю о других методах, которые позволяют сделать это более чем за 1 чтение, например, используя dd один раз для каждого сегмента:

dd if="${INPUT_FILE}" of="${OUTPUT_CRRT_SEGMENT}" skip="${START_SEGMENT}" count="${NBYTES_SEGMENT}" iflag=skip_bytes,count_bytes status=none

но в этом случае, если я прав, невозможно выполнить несколько чтений.

Примечание 2 : если этого еще не существует, я подумываю написать небольшую функцию bash, написанную в C, чтобы сделать это для меня. Как вы думаете, это разумно?

Редактировать 1 : поэтому в основном я хочу команду, которая может сделать что-то в этом роде:

chop --segments=4,20,4 "${FILE_IN}" segment-??

и это дало бы мне segment-01, содержащий первые 4 байта, segment-02, содержащий следующие 20, segment-03, содержащий следующие 4 et c et c.

1 Ответ

1 голос
/ 06 марта 2020

Если Perl - ваш вариант, как насчет:

perl -e '
        $arg1 = shift;
        $file = shift;
        $prefix = shift;

        if ($arg1 =~ /--segments=(.+)/) {
                @segs=split(/,/, $1);
        }
        open(FH, $file) or die "$file";
        for $n (@segs) {
                $outfile = sprintf("%s-%02d", $prefix, ++$i);
                open(W, "> $outfile");
                read(FH, $x, $n);
                print W $x;
        }
' -- --segments=4,20,4 "$FILE_IN" segment

Затем создаются три файла сегмента-01, сегмента-02 и сегмента-03, которые содержат сегменты двоичных данных «$ FILE_IN» «

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...