Um byte portátil por dump hexadecimal de linha

2

Suponha que desejamos um hexadecimal de um byte por linha ASCII . Em Linux usando GNU od , isso funciona:

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

Saída:

 66
 6f
 6f
 0a

Mas isso não funciona com derivados BSD , porque o BSD od util tem flags diferentes.

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

    
por agc 27.09.2016 / 04:51

3 respostas

3

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

Você pode substituí-lo por:

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

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

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

Ou com uma invocação de sed 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:]]*/\
/g;s/\n$//p'

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

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

Qual é também o mais rápido dos 3 em meus testes (comparado ao GNU od ) por uma margem significante para qualquer coisa, menos arquivos pequenos (além de hexdump , não de vim ' xxd ).

    
por 28.09.2016 / 12:48
1

Talvez hexdump :

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

Que é original do BSD seu manual está aqui (no BSD) .

No entanto, o exemplo mostrado acima foi executado no Linux.

    
por 27.09.2016 / 05:02
0

xxd existe no Linux, BSD e OSX :

echo foo | xxd -p -c 1
66
6f
6f
0a
    
por 28.09.2016 / 12:28