8

次の *nix コマンドは、IP とポート (127.0.0.1:80) の 16 進表現を hexdump コマンドにパイプします。

printf "\x7F\x00\x00\x01\x00\x50" | hexdump -e '3/1 "%u." /1 "%u:" 1/2 "%u" "\n"'

-e フラグを使用すると、任意の形式で入力を解析できます。この場合、IP の最初の 3 オクテットを符号なし 10 進数に解析し、その後にドットを付けます。最後のオクテットも符号なし 10 進数に解析されますが、その後にコロンが続きます。最後に、ここに問題があります。ポートの 2 バイトは、改行が続く単一の符号なし 10 進数として解析されます。

このコマンドを実行するシステムのエンディアンによって、結果は異なります。ビッグ エンディアン システムではポート 80 が正しく表示されます。一方、リトル エンディアン システムではポート 20480 が表示されます。

-e を介して任意のフォーマット指定を許可しながら、エンディアンを認識するように hexdump を操作する方法はありますか?

4

1 に答える 1

6

hexdump で実行できるかどうかはわかりませんが、perl では簡単です。

$ printf '\x00\x50' | perl -nE 'sake unpack "S>"''
80
$ printf '\x00\x50' | perl -nE 'say unpack "S<"'
20480

それを微調整して、希望する形式を取得できます。('say' には perl 5.10 が必要です。perl < 5.10 には print を使用してください)

(「質問に答えなかった」ために反対票を投じたい人のために明確にするために。OPがhexdumpをperlに置き換えることを提案しています。必要に応じて反対票を投じてください。)

于 2009-11-20T16:55:35.743 に答える