2009-11-20 11 views
7

Następujące polecenie * nix przetwarza szesnastkową reprezentację adresu IP i portu (127.0.0.1:80) w poleceniu hexdump.Endianness in hexx hexdump

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

Flaga -e umożliwia dowolne formatowanie danych wejściowych. W tym przypadku analizujemy pierwsze trzy oktety adresu IP na niepodpisane miejsca dziesiętne, po których następuje kropka. Końcowy oktet jest również przetwarzany na dziesiętne bez znaku, ale po nim następuje dwukropek. Wreszcie - i tu leży problem - 2 bajty dla portu są analizowane jako pojedynczy dziesiętny bez znaku, po którym następuje znak nowej linii.

W zależności od endianness systemu wykonującego to polecenie, wynik będzie się różnić. System big-endian poprawnie wyświetli port 80; mając na uwadze, że system z małym endianem wyświetli port 20480.

Czy istnieje sposób na manipulowanie hexdumpem, aby być świadomym endianizmu, a jednocześnie pozostawić dowolną specyfikację formatu przez -e?

+0

Zakładam, że nie jest do przyjęcia, aby przygotować dane wejściowe, zamieniając dwa ostatnie bajty, jeśli platforma jest mało-endian, ponieważ zadajesz pytanie? –

+0

Czy to wygląda jak zamiana bajtów będzie konieczne? – shrizza

Odpowiedz

6

nie wiem, że można to zrobić z heksowego, ale to wystarczy łatwy w Perlu:

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

można podkręcić, że aby uzyskać format pragnienie. („Powiedzieć” wymaga Perl 5.10. Użyj druk na Perl < 5.10)

(do wyjaśnienia dla osoby, która chce downvote bo nie „odpowiedzieć na pytanie”. I sugeruję, że OP zastąpić hexdump with perl. Downvote, jeśli musisz.)

+0

Chciałbym trzymać się z dala od C/Perl/Python i po prostu trzymać się bardziej podejście oparte na narzędziach. Być może alternatywa xxd? – shrizza