Портативный шестнадцатеричный дамп по одному байту на строку

Портативный шестнадцатеричный дамп по одному байту на строку

Предположим, нам нужен минималистский вариант — один байт на строку.ASCIIhex дамп. ПодЛинуксс использованиемГНУ od, это работает:

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

Выход:

 66
 6f
 6f
 0a

Но это не сработает сБСДпроизводные, потому чтоБСД odutil имеет разные флаги.

Какой самый портативный?*никсметод? Если это невозможно, какие наилучшие доступные методы?

решение1

odэто стандартная команда. В od -An -tx1 -w1 -vединственное, что не соответствует POSIX — это -wопция.

Вы можете заменить его на:

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

Который будет работать в любой POSIX-совместимой системе и работает, по крайней мере, на FreeBSD:

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

Или с одним sedвызовом для замены tr+ grep:

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

(или

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

)

С помощью perl(не POSIX-команды, но она повсеместно используется везде, кроме встраиваемых систем):

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

Который также является самым быстрым из трех в моих тестах (по сравнению с GNU od) со значительным отрывом для всего, кроме маленьких файлов (также чем hexdump, а не чем vim) xxd.

решение2

Может быть hexdump:

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

Который является оригинальным из BSDего руководство здесь (на BSD).

Однако показанный выше пример был запущен в Linux.

решение3

xxdсуществует в Linux,БСД, иOSX:

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

Связанный контент