この種の文字列がたくさんあるので、それを ascii に変換するコマンドを探したいので、echo -e
andod
で試しましたが、うまくいきませんでした。
0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2
このコードは、テキスト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 進数データを 2 進数に変換します (逆 16 進ダンプのように)。xxd では、各行が行の最初の文字のインデックス番号で始まる必要があります (何かに対して hexdump を実行し、各行がインデックス番号で始まる様子を確認してください)。私たちの場合、各実行には 1 行しかないため、その数を常に 0 にする必要があります。運が良ければ、データには 0x 表記の一部として、すべての文字の前にすでにゼロがあります。小文字の x は xxd によって無視されるため、各 0xhh 文字を xxd にパイプして処理させるだけです。
tr はピリオドをスペースに変換して、 for がピリオドを正しく分割します。
このようなものを使用できます。
$ 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.
echo -e
間違ったエスケープのために失敗したに違いありません。次のコードは、からの同様の出力でうまく機能しますyour_program with arguments
。
echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')
ただし、元の 16 進文字列は印刷できない文字で構成されていることに注意してください。