How to reverse the content of binary file?
With xxd
(from vim
) and tac
(from GNU coreutils, also tail -r
on some systems):
< file.gnp xxd -p -c1 | tac | xxd -p -r > file.png
In zsh
(the only shell that can internally deal with binary data (unless you want to consider ksh93's base64 encoding approach)):
zmodload zsh/mapfile
(LC_ALL=C; printf %s ${(s::Oa)mapfile[file.gnp]} > file.png)
LC_ALL=C
: characters are bytes$mapfile[file.gnp]
: content offile.gnp
files::
: split the string into its byte constituentsOa
: reverseO
rder ona
rray subscript that array
Here is one way of reversing a binary file using ksh93
. I have left the code "loose" to make it easier to understand.
#!/bin/ksh93
typeset -b byte
redirect 3< image.gpj || exit 1
eof=$(3<#((EOF)))
read -r -u 3 -N 1 byte
printf "%B" byte > image.jpg
3<#((CUR - 1))
while (( $(3<#) > 0 ))
do
read -r -u 3 -N 1 byte
printf "%B" byte >> image.jpg
3<#((CUR - 2))
done
read -r -u 3 -N 1 byte
printf "%B" byte >> image.jpg
redirect 3<&- || echo 'cannot close FD 3'
exit 0