Подтвердить что ты не робот

Преобразование шестнадцатеричной строки в ascii в командной строке bash

У меня много таких строк, и я хочу найти команду для преобразования в ascii, я пробовал с echo -e и od, но это не сработало.

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
4b9b3361

Ответ 1

Этот код преобразует текст 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 переводит периоды в пробелы так, чтобы их правильно разделили.

Ответ 2

Это сработало для меня.

$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$

-r говорит, что он преобразует hex в ascii в противоположность его нормальному режиму выполнения противоположного

-p указывает, что он использует простой формат.

Ответ 3

Вы можете использовать что-то вроде этого.

$ 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.

Ответ 4

Указанные вами значения являются значениями 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

И в результате вы получите несколько печатных символов и несколько непечатаемых символов, как показано здесь:

enter image description here

Для преобразования шестнадцатеричных значений в открытый текст с помощью команды echo:

echo -e "\x<hex value here>"

И для преобразования значений UTF-8 в открытый текст с помощью команды echo:

echo -e "\u<UTF-8 value here>"

А затем для преобразования восьмеричного в обычный текст с помощью команды echo:

echo -e "\0<octal value here>"

Если у вас есть значения кодирования, с которыми вы не знакомы, найдите время, чтобы проверить диапазоны в общих схемах кодирования, чтобы определить, к какой кодировке относится значение. Тогда преобразование оттуда несложно.

Ответ 5

echo -e должен был сбой для вас из-за неправильного экранирования. Следующий код отлично работает для меня на аналогичном выходе your_program with arguments:

echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')

Обратите внимание, что ваша оригинальная hexstring состоит из непечатаемых символов.

Ответ 6

Сделайте такой скрипт:

"#!/Bin/Баш

echo $ ((0x $ 1)). $ ((0x $ 2)). $ ((0x $ 3)). $ ((0x $ 4)) "

Пример:

"sh converthextoip.sh c0 a8 00 0b"

Результат:

192.168.0.11