преобразовать двоичные данные в шестнадцатеричный в сценарии оболочки? - PullRequest
47 голосов
/ 09 июня 2011

чувствую себя немного глупо, спрашивая это (звучит как основы), но не могу найти ответ в другом месте. Я хочу преобразовать двоичные данные в шестнадцатеричные, только это, никакого необычного форматирования и все такое. hexdump кажется слишком умным, это "переформатирует" для меня. Я хочу взять x байтов из / dev / random и передать их как шестнадцатеричные.

Желательно, чтобы я использовал только стандартные инструменты linux, чтобы мне не нужно было устанавливать его на каждую машину (их много)

Ответы [ 8 ]

64 голосов
/ 09 июня 2011

Возможно использовать xxd:

% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
29 голосов
/ 16 января 2012

Осторожно!

hexdump и xxd дают результаты с различным порядком байтов!

$ echo -n $'\x12\x34' | xxd -p
1234
$ echo -n $'\x12\x34' | hexdump -e '"%x"'
3412

http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef01543533e604970c-800wi: D

21 голосов
/ 25 июля 2012

С od (системы GNU):

$ echo abc | od -A n -v -t x1 | tr -d ' \n'
6162630a

С hexdump (системы BSD):

$ echo abc | hexdump -ve '/1 "%02x"'
6162630a

С http://en.wikipedia.org/wiki/Hex_dump#od_and_hexdump:
"В зависимости от типа вашей системы, либоили обе эти две утилиты будут доступны - системы BSD не рекомендуют od для hexdump, системы GNU - наоборот. "

10 голосов
/ 09 июня 2011

Возможно, вы могли бы написать свой собственный небольшой инструмент на C и скомпилировать его на лету:

int main (void) {
  unsigned char data[1024];
  size_t numread, i;

  while ((numread = read(0, data, 1024)) > 0) {
    for (i = 0; i < numread; i++) {
      printf("%02x ", data[i]);
    }
  }

  return 0;
}

А затем подайте его из стандартного ввода:

cat /bin/ls | ./a.out

Вы даже можете встроить эту небольшую программу на C в сценарий оболочки, используя синтаксис heredoc.

6 голосов
/ 04 октября 2016

Все решения кажутся трудными для запоминания или слишком сложными, я считаю, что printf самое короткое:

$ printf '%x\n' 256
100

[править]

Но, как отмечено в комментариях, это не то, чего хочет автор, поэтому, если быть честным, ниже приведен полный ответ.

... для использования выше для вывода фактического потока двоичных данных:

printf '%x\n' $(cat /dev/urandom | head -c 5 | od -An -vtu1)

что он делает:

  • printf '% x \ n' .... - печатает последовательность целых чисел, т.е. printf '%x,' 1 2 3, напечатает 1,2,3,
  • $ (...) - это способ получить выходные данные какой-либо команды оболочки и обработать ее
  • cat /dev/urandom - выводит случайные двоичные данные
  • head -c 5 - ограничивает двоичные данные 5 байтами
  • od -An -vtu1 - восьмеричная команда дампа, преобразует двоичный код в десятичный

в качестве тестового примера («a» - это 61 гекс, «p» - это 70 гекс, ...):

$ printf '%x\n' $(echo "apple" | head -c 5 | od -An -vtu1)
61
70
70
6c
65

или для проверки отдельных двоичных байтов, на входе давайте дадим 61 десятичное число (символ '=') для получения двоичных данных (формат '\\x%x' делает это), указанная выше команда будет правильно выводить 3d (десятичное число 61):

$printf '%x\n' $(echo -ne "$(printf '\\x%x' 61)" | head -c 5 | od -An -vtu1)
3d
3 голосов
/ 12 ноября 2013

Если вам нужен большой поток (без перевода строки), вы можете использовать tr и xxd (часть vim) для побайтного преобразования.

head -c1024 /dev/urandom | xxd -p | tr -d $'\n'

Или вы можете использовать hexdump (posix) для пословного преобразования.

head -c1024 /dev/urandom | hexdump '-e"%x"'

Обратите внимание, что разница заключается в порядке байтов.

3 голосов
/ 09 июня 2011

dd + hexdump также будет работать:

dd bs=1 count=1 if=/dev/urandom 2>/dev/null  | hexdump -e '"%x"'
1 голос
/ 16 ноября 2015

Эти три команды будут печатать одинаково (0102030405060708090a0b0c):

n=12
echo "$a" | xxd -l "$n" -p
echo "$a" | od  -N "$n" -An -tx1 | tr -d " \n" ; echo
echo "$a" | hexdump -n "$n" -e '/1 "%02x"'; echo

Учитывая, что n=12 и $a - это байтовые значения от 1 до 26:

a="$(printf '%b' "$(printf '\\0%o' {1..26})")"

Это можно использовать для получения $n случайных байтовых значений в каждой программе:

xxd -l "$n" -p                   /dev/urandom
od  -vN "$n" -An -tx1            /dev/urandom | tr -d " \n" ; echo
hexdump -vn "$n" -e '/1 "%02x"'  /dev/urandom ; echo
...