2009-11-20 25 views
7

Lệnh * nix sau đây trình bày một biểu diễn hex của một IP và cổng (127.0.0.1:80) vào lệnh hexdump.Endianness trong Unix hexdump

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

Cờ -e cho phép định dạng tùy ý phân tích đầu vào. Trong trường hợp này, chúng tôi đang phân tích cú pháp ba octet đầu tiên của IP thành các số thập phân không dấu theo sau là dấu chấm. Octet cuối cùng cũng được phân tích thành một số thập phân không dấu nhưng sau đó là dấu hai chấm. Cuối cùng - và đây là nơi mà vấn đề nằm - 2 byte cho cổng được phân tích cú pháp dưới dạng một dấu thập phân đơn lẻ, theo sau là một dòng mới.

Tùy thuộc vào độ cuối của hệ thống thực hiện lệnh này, kết quả sẽ khác nhau. Một hệ thống lớn cuối cùng sẽ hiển thị đúng cổng 80; trong khi hệ thống nhỏ gọn sẽ hiển thị cổng 20480.

Có cách nào để thao tác hexdump để nhận biết về độ tin cậy trong khi vẫn cho phép đặc tả định dạng tùy ý qua -e không?

+0

Tôi cho rằng không thể chuẩn bị đầu vào bằng cách hoán đổi hai byte cuối nếu nền tảng là nhỏ, vì bạn đang đặt câu hỏi? –

+0

Có vẻ như việc hoán đổi byte sẽ là cần thiết? – shrizza

Trả lời

6

Tôi không biết rằng nó có thể được thực hiện với hexdump, nhưng nó đủ dễ dàng trong perl:

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

Bạn có thể tinh chỉnh rằng để có được những định dạng mà bạn mong muốn. ('Nói' đòi hỏi perl 5.10. Sử dụng in cho perl < 5,10)

(Để làm rõ cho người có nhu cầu downvote vì tôi đã không "trả lời câu hỏi". Tôi gợi ý rằng OP thay thế hexdump with perl. Downvote nếu bạn phải.)

+0

Tôi muốn tránh xa C/Perl/Python và chỉ cần tuân theo một cách tiếp cận dựa trên công cụ hơn. Có lẽ một thay thế xxd? – shrizza