web-dev-qa-db-ja.com

Ascii / Hex変換bash

私は今、このようにやっています:

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

しかし、それは私が望んでいたように正確に動作していません、

Aaの16進形式は4161である必要がありますが、出力は6141 000aであり、意味をなさないようです。

aSCIIに16進数を実行するとき、接頭辞\xを必要としない別のユーティリティがありますか?

38
gdb

理由は、hexdumpがデフォルトでバイトではなく16ビット整数を出力するためです。システムにそれらがある場合、hd(またはhexdump -C)またはxxdは驚くほど少ない出力を提供します-そうでない場合、od -t x1はバイトを取得するPOSIX標準の方法ですバイトごとの16進出力。 od -t x1cを使用して、バイトの16進値と対応する文字の両方を表示できます。

xxd(vimに同梱)がある場合、xxd -rを使用して16進数から(xxdが生成する同じフォーマットから)変換することができます。プレーンな16進数(xxd -pによって生成される '4161'のみ)がある場合は、xxd -r -pを使用して元に戻すことができます。

52
Random832

最初の部分については、試してください

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
18
Mikel
$> printf "%x%x\n" "'A" "'a"
4161
14
bash-o-logist

単一回線ソリューションの場合:

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
7
Fırat KÜÇÜK

Bashの場合:

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

6162636465666768696A

2
Vouze

それがどのようにクレイジーに見えるかわかりませんが、それは本当にうまく仕事をします

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

私がHEXで私の名前を見ようとしたときにこれを作成しました;)どのように使用できますか:)

2
Kundan Kumar
echo -n Aa | hexdump -e '/1 "%02x"'; echo
1
baz

上記のSteinAirの回答は私にとって有益でした-ありがとう!以下は、16進文字列をASCIIに変換するためのインスピレーションの方法です。

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

4161

トリックは、sedを使用してText2Convを解析し、forを使用してanfループを分離できるようにフォーマットすることです。

1
SteinAir

ここに、ASCIIを16進数に変換するために書いた小さなスクリプトを示します。それが役に立てば幸い:

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
1
blogresponder

http://mylinuxbook.com/hexdump/ に従って、hexdump形式パラメーターを使用できます

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

戻ります 4161

最後に改行を追加するには、別のフォーマッターを追加します。

ただし、上記の形式は、繰り返し文字の乗数出力を提供します

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

の代わりに

48656c6c6f
0
childno͡.de

私が使う:

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

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

tr -d '\n'は、入力内の可能な改行を削除します

0
stelios