web-dev-qa-db-ja.com

bashコマンドラインで16進文字列をASCIIに変換

この種類の文字列がたくさんあるので、ASCIIで変換するコマンドを見つけたいので、echo -eおよびodが、動作しませんでした。

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
37
Kerby82

このコードはテキストを変換します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は、16進データをバイナリに変換します(逆16進ダンプのように)。 xxdでは、各行がその行の最初の文字のインデックス番号で始まることが必要です(何かに対してhexdumpを実行し、各行がインデックス番号で始まる方法を確認します)。この場合、各実行には1行しかないため、その数値は常にゼロにしたいです。運がよければ、データには0x表記の一部としてすべての文字の前にすでにゼロがあります。小文字のxはxxdによって無視されるため、行う必要があるのは、各0xhh文字をxxdにパイプして、処理させることだけです。

Trは、ピリオドをスペースに変換して、forがそれを正しく分割するようにします。

17
Dan Bliss

これは私のために働いた。

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

-rは、通常のモードではなく、16進数をASCIIに変換するように指示します。

-pは、プレーン形式を使用するように指示します。

110
funroll

このようなものを使用できます。

$ 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.
5
Raghu Sodha

指定した値は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コマンドを使用して16進値をプレーンテキストに変換するには:

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

echoコマンドを使用してUTF-8値をプレーンテキストに変換するには:

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

そして、echoコマンドを使用して8進数をプレーンテキストに変換するには:

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

慣れていないエンコード値がある場合は、一般的なエンコードスキームの範囲をチェックして、値がどのエンコードに属しているかを確認してください。そこからの変換は簡単です。

4
Yokai

echo -eは、間違ったエスケープのために失敗したに違いありません。次のコードは、your_program with argumentsからの同様の出力でうまく機能します。

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

ただし、元の16進文字列は印刷できない文字で構成されていることに注意してください。

1