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 ]

0 голосов
/ 30 марта 2019

Я использую:

> echo Aa | tr -d '\n' | xxd -p
4161

> echo 414161 | tr -d '\n' | xxd -r -p
AAa

tr -d '\n' обрезает любые возможные новые строки в вашем вводе

0 голосов
/ 23 июля 2017
jcomeau@aspire:~$ echo -n The quick brown fox jumps over the lazy dog | python -c "print raw_input().encode('hex'),"
54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67
jcomeau@aspire:~$ echo -n The quick brown fox jumps over the lazy dog | python -c "print raw_input().encode('hex')," | python -c "print raw_input().decode('hex'),"
The quick brown fox jumps over the lazy dog

это можно сделать и с Python3, но по-другому, и я ленивая собака.

0 голосов
/ 29 июня 2016

собирался написать это как комментарий к @ 'S Coombs', но боялся, что это не поместится, и форматирование в комментариях не работает так хорошо.

Re:

for h in $(echo "4161" | sed "s/\(..\)/\1 /g"); do printf `echo "\x$h"`;done

Хорошо для ASCII, но я думаю, что стандартом для большинства дистрибутивов в наши дни является UTF-8 (и был во многих до 2011 года).Практически ничего из вышеперечисленного "не делает правильно" со входом UTF-8.Пример: используя юникод "звезда" (U + 2605), приведенный выше код выдает:

> LC_ALL=en_US.UTF-8        ## making this explicit for this example
> star="★"
> hex () {
  if ((!$#)); then return; fi
  for ((i=0;i<${#1};i++));do printf %02X \'${$1:$i:1};done
}
> hex "$star"
2605

Если вы хотите, чтобы фактические шестнадцатеричные байты UTF-8 составляли звезду, вам нужно установить локальпервый.Как в:

> LC_ALL=C hex "$star"
E29885

Если у вас смешанный вывод (например, латинская строчная буква 'a'), звезда (U + 2605 = '★') и «Математическое без засечек A» (U + 1D5BA = '?'), и вам нужны символьные значения, тогда вам нужно закодировать вывод на основе символьного значения.Те, которые ниже 0x7f, могут быть напечатаны как шестнадцатеричные (\ x7f в строках bash), но для тех, которые ниже ~ 64K, требуется \ u2605 (для запуска), а для остальных выше 64K требуется \ U {8 шестнадцатеричных цифр} или \ U0001D5BA дляMath-A, или что-то вроде:

> star='★' math_a='?'
> locale_hex "a$star$math_a"
\X61\u2605\U0001D5BA

Но это технически будет «не по теме» для исходного вопроса - но все же это то, о чем нужно знать и учитывать.Публикация решения, которое генерирует этот вывод, будет "слишком большим количеством OT-текста" для моего удобства (надеюсь, этот Caveat не считается слишком расходящимся от исходного вопроса - так как у меня были похожие 'ord', 'hex' (и 'chr') функции, которые дали мне возможность работать в ascii, которые были серьезно сбиты с толку, когда в микс были добавлены значения по умолчанию UTF-8.

Хотя приведенные выше ответы хороши для систем только для ascii, они становятся редкими зверями в наши днитем более что кодировка символов по умолчанию для HTML5 = UTF-8.

0 голосов
/ 01 октября 2014

в соответствии с http://mylinuxbook.com/hexdump/ вы можете использовать параметр формата hexdump

echo Aa | hexdump -C -e '/1 "%02X"'

вернется 4161

чтобы добавить дополнительный перевод строки в конце, добавьте другой форматер.

НО: приведенный выше формат даст выходные данные для повторяющихся символов

$ printf "Hello" | hexdump -e '/1 "%02X"' 
48656C*
6F

вместо

48656c6c6f
0 голосов
/ 11 сентября 2014

echo добавляет возврат каретки в конце.

Используйте

echo -e

, чтобы удалить лишние 0x0A

Кроме того, hexdump не работает байтов за байтомпо умолчанию.Вот почему он показывает вам байты в странном порядке байтов и почему он показывает вам дополнительные 0x00.

...