xxdを使用して、文字列ではなく16進数のバイナリ表現を出力できますか?


10

プロトコルをテストするために、コマンドラインで16進数から生のバイナリパケットを生成したいと思います。アプリケーションを書くよりも、この方法で簡単にできることを願っています。

現在の状況は次のとおりです。

echo '0A' | xxd  -b
0000000: 00110000 01000001 00001010

私が欲しいのは:

echo '0A' | xxd  -b
0000000: 00001010    

または

echo '0A' | xxd  -b
0000000: 01010000    

私は必要なエンディアンについて確信が持てないので。必要に応じて変更したい。これは達成可能ですか?

回答:


9

echo '0A'3つの文字を生成し0 A NLます。xxd -b次に、これらの3文字をバイナリで出力します。値が10(つまり16進数A)の1バイトだけが必要な場合は、次のように記述できます(bashで)。

echo -n $'\x0A'
      ^ ^  ^
      | |  |
      | |  +-- `\x` indicates a hexadecimal escape
      | +----- Inside a $' string, escapes are interpreted
      +------- -n suppresses the trailing newline

より良い代替案はprintf '\x0A'、printfは、フォーマット文字列のエスケープシーケンスを解釈し、暗黙の改行を出力しません。(これはPosix互換のソリューションであり、どのPosix互換シェルでも動作するはずです。)さらに別のbashの可能性はecho -n -e '\x0A'です。(非標準)-eフラグは、escapeシーケンスを解釈するようにエコーに要求します。

echo '1' | xxd -bこれは16進数50であることxxdがわからないので0A、16進数と同等のものを出力しませ1ん。また、文字のASCIIコード1は16進数であり31、ではありません50

エンディアンはバイトに影響しません。バイト内のビットの順序は、バイトがシリアルラインを介して送信されるまで完全に概念的であり、オシロスコープなどでしか見えません。


について申し訳ありません50。それはタイプミスです。今すぐ修正
TheMeaningfulEngineer 14

7

あなたが進数の文字列のバイナリ出力をしたい場合は、xxd -r -p。例えば:

 $ echo '0A0B0C0D' | xxd -r -p | xxd -b
 0000000: 00001010 00001011 00001100 00001101                    ....

0A0B0C0Dを4バイトのバイナリーに変換し(最初のxxdへの呼び出し)、次に変換して出力可能にします(2番目の呼び出し)。あなたはバイナリ出力が欲しいと言いますが、あなたがしようとしている例は印刷可能な表現です。

2番目の例で示唆しているように、ニブルレベルでエンディアンが曖昧なところは何も知りません。xxdでの変換は、一度に純粋なバイトであり、特定のマルチバイト数を表すとは限りません。


2

はい、使用できますがxxd、入力形式が気に入らない場合があります。あなたの例から、0x0aはASCII改行の16進値です。改行を1つ含むファイルを作成し、を使用xxdしてリストを作成できます。

$ xxd one_line_file
0000000: 0a                                       .

xxd適切なフラグを指定すると、その出力から単一の改行を取得できます。

$ echo "0000000: 0a" | xxd -r > another_one_line_file
$ xxd another_one_line_file
0000000: 0a 

xxd出力フォーマットはかなりいいです。テキストエディターを使用してパケットを作成し、xxd -rバイナリに移動するのはそれほど面倒ではありません。。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.