Преобразование шестнадцатеричной строки в ASCII в bash командной строки
у меня много такого рода строк, и я хочу найти команду для ее преобразования в ascii, я пробовал с echo -e
и od
, но это не сработало.
0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
5 ответов
этот код преобразует текст 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
в поток 11 байт с эквивалентными значениями. Эти байты будут записаны в standard out.
TESTDATA=$(echo '0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2' | tr '.' ' ')
for c in $TESTDATA; do
echo $c | xxd -r
done
как указывали другие, это не приведет к печати строки ASCII по той простой причине, что указанные байты не являются ASCII. Вам нужно опубликовать больше информации о том, как вы получили эту строку, чтобы мы помогли вам в этом.
Как это работает: xxd-r преобразует шестнадцатеричные данные в двоичные (например, обратный шестнадцатеричного представления). xxd требует, чтобы каждая строка начиналась с индексного номера первого символа в строке (запустите hexdump на чем-то и посмотрите, как каждая строка начинается с индексного номера). В нашем случае мы хотим, чтобы это число всегда было нулевым, так как каждое выполнение имеет только одну строку. К счастью, наши данные уже имеют нули перед каждым символом как часть 0x нотации. Нижний регистр x игнорируется xxd, поэтому все, что нам нужно сделать, это передать каждый символ 0xhh в xxd и позволить ему сделать работа.
tr переводит периоды в пробелы, чтобы for разделил его правильно.
это работает для меня.
$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$
-r
говорит ему преобразовать hex в ascii в отличие от его нормального режима выполнения противоположного
-p
говорит ему использовать простой формат.
вы можете использовать что-то вроде этого.
$ cat test_file.txt
54 68 69 73 20 69 73 20 74 65 78 74 20 64 61 74 61 2e 0a 4f 6e 65 20 6d 6f 72 65 20 6c 69 6e 65 20 6f 66 20 74 65 73 74 20 64 61 74 61 2e
$ for c in `cat test_file.txt`; do printf "\x$c"; done;
This is text data.
One more line of test data.
на echo -e
должно быть, не для вас из-за плохого экранирования.
Следующий код отлично работает для меня на аналогичном выходе из your_program with arguments
:
echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\x/g')
обратите внимание, что исходная шестнадцатеричная строка состоит из непечатаемых символов.
в значений значения UTF-8. При установке массива:
declare -a ARR=(0xA7 0x9B 0x46 0x8D 0x1E 0x52 0xA7 0x9B 0x7B 0x31 0xD2)
будет проанализирован для печати символов открытого текста каждого значения.
for ((n=0; n < ${#ARR[*]}; n++)); do echo -e "\u${ARR[$n]//0x/}"; done
и выход даст несколько печатаемых символов и некоторые непечатаемые символы, как показано здесь:
для преобразования шестнадцатеричных значений в открытый текст с помощью echo
команда:
echo -e "\x<hex value here>"
и для преобразования значений UTF-8 в открытый текст с помощью echo
команда:
echo -e "\u<UTF-8 value here>"
а затем для преобразования восьмеричного текста в открытый с помощью echo
команда:
echo -e "<octal value here>"
когда у вас есть значения кодирования, с которыми вы не знакомы, найдите время, чтобы проверить диапазоны в общих схемах кодирования, чтобы определить, к какой кодировке принадлежит значение. Тогда преобразование оттуда происходит быстро.