POSIXly:
od -An -vtu1 < file > file.encoded
Em que cada e e v
ery byte do arquivo é codificado como um número decimal u
nsigned, com n
o A
ddress.
Para decodificar, com algumas implementações awk
(aquelas como gawk
ou mawk
onde printf("%c", 0)
funciona):
awk '{for (i = 1; i <= NF; i++) printf "%c", $i}' < file.encoded > file
Algumas notas sobre por que sua abordagem não funciona:
- shells diferentes de
zsh
não podem armazenar dados arbitrários (especialmente o byte NUL) em suas variáveis. - e substituição de comando em shells do tipo Bourne, arrastando caracteres de nova linha (0xa bytes na maioria dos sistemas)
- você precisa citar variáveis em shells semelhantes a Bourne que não sejam
zsh
- Em shells que têm o operador
${var:offset:length}
ksh93
(ksh93
,bash
,zsh
,mksh
),offset
elength
são expressos em número de caracteres, não bytes ( No entanto, o UTF-8 é a única codificação de caracteres de múltiplos bytes suportada pormksh
e somente quando a opçãoutf8-mode
está ativada). -
printf %d \'x
retorna o número do código do caractere. Isso é apenas o valor de byte em conjuntos de caracteres de byte único. Aqui, você provavelmente está usandobash
e está em uma localidade usando a codificação UTF-8 como bash 'printf
fornece valores aleatórios para bytes que não fazem parte de caracteres válidos lá . - o texto é definido como sequências de linhas de texto, elas próprias sequências de caracteres não-NUL (limitadas a seqüências de bytes formando caracteres válidos) cujo tamanho (em número de bytes incluindo o caractere de nova linha) não excede
LINE_MAX
(consultegetconf LINE_MAX
) e é delimitado por um caractere de nova linha. Então, exceto para arquivos jpg muito pequenos, seusai.out
acabaria não sendo texto válido e você não teria garantia de que seria processado corretamente por utilitários de texto (od
aqui gera apenas alguns números por linha).