Ответ 1
Возможно, используйте xxd
:
% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
чувствую себя немного глупо, спрашивая об этом (звучит как основа), но не может найти ответ в другом месте. Я хочу преобразовать двоичные данные в шестнадцатеричный, просто это, не причудливое форматирование и все. hexdump
кажется слишком умным, это "overformats" для меня. Я хочу взять x байтов из /dev/random и передать их как hex.
Предпочтительно, я бы хотел использовать только стандартные инструменты linux, так что мне не нужно устанавливать их на каждую машину (их много)
Возможно, используйте xxd
:
% xxd -l 16 -p /dev/random
193f6c54814f0576bc27d51ab39081dc
Остерегайтесь!
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
С системами 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 обратные."
Возможно, вы могли бы написать свой собственный небольшой инструмент на 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.
Все решения, кажется, трудно запомнить или слишком сложны, я считаю, что printf
самый короткий:
$ printf '%x\n' 256
100
[править]
Но, как отмечено в комментариях, это не то, чего хочет автор, поэтому справедливым ниже является полный ответ.
... использовать выше для вывода фактического двоичного потока данных:
printf '%x\n' $(cat /dev/urandom | head -c 5 | od -An -vtu1)
что он делает:
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
dd + hexdump также будет работать:
dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -e '"%x"'
Если вам нужен большой поток (без новой строки), вы можете использовать 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"'
Обратите внимание, что разница - это строгость.
Эти три команды будут печатать то же самое (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