2009-11-20 51 views
7

下面的* nix命令將IP和端口(127.0.0.1:80)的十六進制表示轉換爲hexdump命令。Unix中的字節順序hexdump

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

-e標誌允許任意格式解析輸入。在這種情況下,我們將IP的前三個八位字節解析爲無符號小數,後面跟着一個點。最後的八位組也被解析成一個無符號的十進制數,但後面跟着一個冒號。最後 - 這就是問題所在 - 端口的2個字節被解析爲一個單一的無符號小數,然後是一個換行符。

根據執行此命令的系統的字節順序,結果會有所不同。大端系統將正確顯示端口80;而一個小端系統將顯示端口20480.

有什麼辦法來操縱hexdump來了解endianness,同時仍然允許通過-e任意格式指定嗎?

+0

我認爲如果平臺是小端的,那麼必須通過交換最後兩個字節來準備輸入是不可接受的,因爲您問的是這個問題? – 2009-11-20 16:38:32

+0

它看起來像一個字節交換將是必要的? – shrizza 2009-11-20 16:44:53

回答

6

我不知道,它可以與hexdump都可以做,但它是用Perl足夠 簡單:

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

你可以調整,要得到你想要的格式。 (「說」 需要Perl 5.10。使用打印爲Perl < 5.10)

(澄清誰希望downvote因爲我沒有 「回答這個問題。」我的建議是,OP代替人 hexdump with perl。如果必須,請使用Downvote。)

+0

我想遠離C/Perl/Python,只是堅持更基於工具的方法。也許是一個xxd的選擇? – shrizza 2009-11-20 17:14:11