使用bash在一次读取中拆分(chop?)一个二进制文件,其中包含任意数量的不同预定大小的段



有时二进制文件具有"beforehands"约定的格式,并且具有独立含义的二进制数据段。例如,二进制文件可以具有结构

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

我想在bash中拆分/切碎(不确定哪个词最好(这样一个二进制文件,用任意数量/大小的段进行一次读取。知道怎么做吗?

注意1:我知道其他方法可以在一次以上的读取中做到这一点,例如对每个段使用一次dd:

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

但在这种情况下,如果我是对的,就没有办法执行几次读取。

注意2:如果这还不存在,我正在考虑写一个用C编写的小bash函数来为我做这件事。你认为这合理吗?

编辑1:所以基本上我想要一个可以做这种事情的命令:

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

这将为我提供包含前4个字节的segment-01、包含下一个20的segment-02、包含下个4的segment-03

如果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

然后创建三个文件segment-01、segment-02和segment-03,其中包含"$FILE_IN"的二进制数据段

相关内容

最新更新