Dump hexadecimal portátil de um byte por linha

Dump hexadecimal portátil de um byte por linha

Suponha que queiramos um byte minimalista por linhaASCIIdespejo hexadecimal. SobLinuxusandoGNU od, isso funciona:

echo foo | od -An -tx1 -w1 -v

Saída:

 66
 6f
 6f
 0a

Mas isso não vai funcionar comBSDderivados, porque oBSD odutil tem sinalizadores diferentes.

Qual é o mais portátil*nixmétodo? Caso contrário, quais são os melhores métodos disponíveis?

Responder1

odé um comando padrão. Em od -An -tx1 -w1 -v, a única coisa que não é POSIX é a -wopção.

Você pode substituí-lo por:

od -An -vtx1 | LC_ALL=C tr -cs '0-9a-fA-F' '[\n*]' | grep .

O que funcionaria em qualquer sistema compatível com POSIX e funciona pelo menos no FreeBSD:

$ echo test | od -An -vtx1 | LC_ALL=C tr -cs 0-9a-fA-F '[\n*]' | grep .
74
65
73
74
0a

Ou com uma sedinvocação para substituir o tr+ grep:

od -An -vtx1 | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//;/./!d
s/[[:blank:]]\{1,\}/\
/g'

(ou

od -An -vtx1 | sed -n 's/[[:blank:]]*\([^[:blank:]]\{2\}\)[[:blank:]]*/\1\
/g;s/\n$//p'

)

Com perl(não é um comando POSIX, mas é onipresente em qualquer coisa, exceto em sistemas embarcados):

perl -ne '
  BEGIN{$/ = \8192; $, = $\ = "\n"}
  print  unpack "(H2)*", $_'

Que também é o mais rápido dos 3 em meus testes (em comparação com GNU od) por uma margem significativa para qualquer coisa, exceto arquivos pequenos (também que hexdump, não que vim) xxd.

Responder2

Talvez hexdump:

$ echo foo | hexdump -v -e '1/1 "%02x\n"'
66
6f
6f
0a

Que é original do BSDseu manual está aqui (em BSD).

Porém o exemplo mostrado acima foi executado em Linux.

Responder3

xxdexiste no Linux,BSD, eOSX:

echo foo | xxd -p -c 1
66
6f
6f
0a

informação relacionada