У меня много таких строк, и я хочу найти команду для преобразования их в ascii, я пробовал с echo -e
и od
, но ничего не получилось.
0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
Это сработало для меня.
$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$
-r
указывает программе преобразовать шестнадцатеричный код в ascii, в отличие от обычного режима, когда все происходит наоборот.
-p
указывает ему использовать обычный формат.
Этот код преобразует текст 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
в поток из 11 байтов с эквивалентными значениями. Эти байты будут записаны в стандартный выход.
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 переводит шестнадцатеричные данные в двоичные (как обратный hexdump). xxd требует, чтобы каждая строка начиналась с индексного номера первого символа в строке (запустите hexdump на чем-нибудь и посмотрите, как каждая строка начинается с индексного номера). В нашем случае мы хотим, чтобы этот номер всегда был нулевым, поскольку в каждом выполнении есть только одна строка. К счастью, наши данные уже имеют нули перед каждым символом, как часть обозначения 0x. Нижний регистр x игнорируется xxd, поэтому все, что нам нужно сделать, это передать каждый символ 0xhh в xxd и позволить ему выполнить работу.
tr переводит периоды в пробелы, чтобы for правильно разделил их.
Вы можете использовать что-то вроде этого.
в
$ 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.
В значений значения 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 -e "\x<hex value here>"
И для преобразования значения UTF-8 в обычный текст с помощью " эхо " команды:
echo -e "\u<UTF-8 value here>"
А затем для преобразования восьмеричных в обычный текст с помощью команды "Эхо":
echo -e "\0<octal value here>"
Когда у вас есть значения кодирования вы'т знакомы, не торопитесь, чтобы проверить диапазоны в общие схемы кодирования, чтобы определить, что кодирование значение принадлежит. После конвертирования есть кнопка.
Должно быть, echo -e
не работает из-за неправильного экранирования.
Следующий код работает нормально на аналогичном выводе из вашей_программы с аргументами
:
echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')
Однако обратите внимание, что ваша исходная шестнадцатеричная строка состоит из непечатаемых символов.
Сделать скрипт вроде этого:
" и#!/бин/Баш
Эхо $((0х$1)).$((0х$2)).$((0х$3)).$((0х$4))"и
Пример:
на "Ш converthextoip.sh ц0 А8 00 0В"и
Результат:
192.168.0.11