有时二进制文件具有"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"的二进制数据段