Com xxd
(de vim
) e tac
(de GNU coreutils, também tail -r
em alguns sistemas):
< file.gnp xxd -p -c1 | tac | xxd -p -r > file.png
Eu estava resolvendo um desafio em que encontrei um arquivo de dados sem extensão. O comando file
mostra que é um arquivo de dados (application / octet-stream) . O comando hd
mostra GNP. na última linha. Então, se eu inverter este arquivo, então eu vou pegar o arquivo de formato .PNG , eu procurei em todos os lugares, mas não encontrei solução como reverse
conteúdo do arquivo binário. Por favor, sugira qualquer método.
com perl
:
<file.gnp perl -0777 -F -ape '$_=reverse@F' > file.png
-a
: awk
modo onde os registros são divididos em campos -0777 -p
: modo slurp, arquivo lido em um registro $_
, registro modificado impresso posteriormente. -F
: separador de campo vazio, portanto, os campos são bytes individuais $_=reverse@F
: registro de saída é a concatenação da lista de campos ( @F
) revertidos. Aqui está uma maneira de reverter um arquivo binário usando ksh93
. Deixei o código "solto" para facilitar a compreensão.
#!/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
Em zsh
(o único shell que pode lidar internamente com dados binários (a menos que você queira considerar a abordagem de codificação base64 do ksh93 )):
zmodload zsh/mapfile
(LC_ALL=C; printf %s ${(s::Oa)mapfile[file.gnp]} > file.png)
LC_ALL=C
: caracteres são bytes $mapfile[file.gnp]
: conteúdo de file.gnp
file s::
: divide a string em seus constituintes de bytes Oa
: inverter O
rder em a
rray subscrito essa matriz Eu tentei o seguinte:
tac -rs '.' input.gnp > output.png
A idéia é forçar 'tac' usando qualquer caractere como separador. Eu tentei isso em um arquivo binário e parecia funcionar, mas qualquer confirmação seria apreciada.
A principal vantagem é que ele não carrega arquivos na memória.