How do I extract a single chunk of bytes from within a file?
Try dd
:
dd skip=102567 count=253 if=input.binary of=output.binary bs=1
The option bs=1
sets the block size, making dd
read and write one byte at a time. The default block size is 512 bytes.
The value of bs
also affects the behavior of skip
and count
since the numbers in skip
and count
are the numbers of blocks that dd
will skip and read/write, respectively.
This is an old question, but I'd like to add another version of the dd
command that is better-suited for large chunks of bytes:
dd if=input.binary of=output.binary skip=$offset count=$bytes iflag=skip_bytes,count_bytes
where $offset
and $bytes
are numbers in byte units.
The difference with Thomas's accepted answer is that bs=1
does not appear here. bs=1
sets the input and output block size to 1 byte, which makes it terribly slow when the number of bytes to extract is large.
This means we leave the block size (bs
) at its default of 512 bytes. Using iflag=skip_bytes,count_bytes
, we tell dd
to treat the values after skip
and count
as byte amount instead of block amount.
head -c
+ tail -c
Not sure how it compares to dd
in efficiency, but it is fun:
printf "123456789" | tail -c+2 | head -c3
picks 3 bytes, starting at the 2nd one:
234
See also:
- How to grab an arbitrary chunk from a file on Unix/Linux
- Manual for head
- Manual for tail
The dd command can do all of this. Look at the seek and/or skip parameters as part of the call.