Преобразовать двоичные данные в hex в оболочке script?

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

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

Ответ 1

Возможно, используйте xxd:

% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc

Ответ 3

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

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

С помощью hexdump (BSD systems):

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

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

Ответ 4

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

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 в оболочку script с помощью синтаксиса heredoc.

Ответ 5

Все решения, кажется, трудно запомнить или слишком сложны, я считаю, что 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 hex, 'p' - 70 hex,...):

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

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

$printf '%x\n' $(echo -ne "$(printf '\\x%x' 61)" | head -c 5 | od -An -vtu1)
3d

Ответ 6

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

dd bs=1 count=1 if=/dev/urandom 2>/dev/null  | hexdump -e '"%x"'

Ответ 7

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

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

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

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

Обратите внимание, что разница - это строгость.

Ответ 8

Эти три команды будут печатать то же самое (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