Ascii / Hex конвертировать в Bash - PullRequest
36 голосов
/ 20 апреля 2011

Я сейчас делаю это так:

[root@~]# echo Aa|hexdump -v
0000000 6141 000a                              
0000003
[root@~]# echo -e "\x41\x41\x41\x41"
AAAA

Но это не совсем так, как я хотел,

шестнадцатеричная форма Aa должна быть 4161, новывод 6141 000a, что, кажется, не имеет смысла.

и при выполнении hex для ascii, есть ли другая утилита, так что мне не нужен префикс \x?

Ответы [ 15 ]

50 голосов
/ 20 апреля 2011

Причина в том, что hexdump по умолчанию печатает 16-битные целые числа, а не байты.Если в вашей системе они есть, hd (или hexdump -C) или xxd обеспечат менее неожиданные результаты - если нет, od -t x1 - это стандартный способ POSIX для получения побайтного шестнадцатеричного вывода.Вы можете использовать od -t x1c для отображения как шестнадцатеричных значений байтов, так и соответствующих букв.

Если у вас есть xxd (который поставляется с vim), вы можете использовать xxd -r для преобразования обратно из шестнадцатеричного (изтот же формат xxd выдает).Если у вас просто обычный гекс (просто «4161», который создается xxd -p), вы можете использовать xxd -r -p для обратного преобразования.

17 голосов
/ 20 апреля 2011

Для первой части попробуйте

echo Aa | od -t x1

Он печатает побайтово

$ echo Aa | od -t x1
0000000 41 61 0a
0000003

0a - это неявная новая строка, которую производит echo.

Используйте echo -n или printf.

$ printf Aa | od -t x1
0000000 41 61
0000002
13 голосов
/ 20 апреля 2011
$> printf "%x%x\n" "'A" "'a"
4161
7 голосов
/ 18 апреля 2018

Для однолинейного решения:

echo "Hello World" | xxd -ps -c 200 | tr -d '\n'

Будет напечатано:

48656c6c6f20576f726c640a

или для файлов:

cat /path/to/file | xxd -ps -c 200 | tr -d '\n'

Для обратной операции:

echo '48656c6c6f20576f726c640a' | xxd -ps -r

Будет напечатано:

Hello World
2 голосов
/ 16 октября 2015

с bash:

a=abcdefghij    
for ((i=0;i<${#a};i++));do printf %02X \'${a:$i:1};done

6162636465666768696A

2 голосов
/ 17 февраля 2012

Я не знаю, как это безумно выглядит, но это действительно хорошо справляется с работой

ascii2hex(){ a="$@";s=0000000;printf "$a" | hexdump | grep "^$s"| sed s/' '//g| sed s/^$s//;}

Создано, когда я пытался увидеть свое имя в HEX;) используйте, как вы можете его использовать:)

1 голос
/ 27 марта 2018
echo -n Aa | hexdump -e '/1 "%02x"'; echo
1 голос
/ 07 июня 2016

Ответ SteinAir выше был мне полезен - спасибо!Ниже приведен способ преобразования шестнадцатеричных строк в ascii:

for h in $(echo "4161" | sed "s/\(..\)/\1 /g"); do printf `echo "\x$h"`;done
Aa
1 голос
/ 30 ноября 2014
Text2Conv="Aa"
for letter in $(echo "$Text2Conv" | sed "s/\(.\)/'\1 /g");do printf '%x' "$letter";done

4161

Хитрость заключается в использовании sed для синтаксического анализа Text2Conv для форматирования, после чего мы можем отделить цикл anf, используя for.

1 голос
/ 19 января 2014

вот небольшой скрипт, который я написал для преобразования ascii в hex. надеюсь, это поможет:

echo '0x'"`echo 'ASCII INPUT GOES HERE' | hexdump -vC |  awk 'BEGIN {IFS="\t"} {$1=""; print }' | awk '{sub(/\|.*/,"")}1'  | tr -d '\n' | tr -d ' '`" | rev | cut -c 3- | rev
...