sự khác biệt định dạng hexdump so với xxd


9

Tôi đã tìm kiếm cách thực hiện một hexdump ngược và tìm thấy xxd được đề cập. Tuy nhiên, nó dường như không hoạt động với đơn giản:

xxd -r hexdumpfile > binaryfile

Sau đó, tôi đã so sánh sự khác biệt giữa đầu ra của xxd infilehexdump infile, và tìm thấy ba điểm khác biệt:

  1. đầu ra xxd có dấu hai chấm sau địa chỉ
  2. Đầu ra xxd có các vị trí trong dữ liệu được đảo ngược (ví dụ: 5a42trong đầu ra hexdump trở thành 425ađầu ra xxd)
  3. Có một số ký tự phụ sau mỗi dòng

Tôi chỉ có phiên bản hexdumped của một số tệp nhất định trên máy chủ. Làm thế nào tôi có thể lấy lại chính xác dữ liệu nhị phân bằng xxd?


Đã tìm kiếm một số tùy chọn trong xxd để có định dạng hexdump, nhưng hiện tại, đã quản lý để thực hiện nó với một số thao tác sed đơn giản
tanon

Tôi chưa thực sự kiểm tra chính xác những gì bạn yêu cầu, nhưng hãy thử xxd -p và -b, -p là đơn giản -b là nhị phân, cũng như -r của bạn. Đối với thứ tự byte, điều đó sẽ xảy ra với endian lớn và endian nhỏ và có thể xxd không thể đảo ngược điều đó .. nhưng nó liên quan đến cách các byte được lưu trữ trong tệp. Giống như, nếu bạn có tệp văn bản trong notepad , bạn có thể lưu nó dưới dạng unicode lớn 16 bit, hoặc endian nhỏ hoặc UTF-8 hoặc bất cứ thứ gì, và bạn thấy sự khác biệt từ xxd. Lệnh od có thể hiển thị nó khác nhau.
barlop

Để tham khảo trong tương lai, hexdumpcho phép bạn chọn độ bền được sử dụng trong đầu ra của nó, điều này có thể làm cho việc này đơn giản hơn. (Tại sao bây giờ? Tìm thấy câu hỏi của bạn hữu ích cho một cái gì đó không liên quan.)
jpaugh

Câu trả lời:


7

Không có lệnh nào tôi biết sẽ thực hiện chuyển đổi, nhưng nó có thể dễ dàng được chia thành một vài bước:

  1. Tách địa chỉ từ hexdumpđầu ra bằngsed
  2. Chuyển đổi thành nhị phân bằng cách sử dụng xxd
  3. Chuyển đổi endian (ví dụ, 5a42trở thành 425a) bằng cách sử dụngdd

Đây là lệnh đầy đủ:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile

không hoạt động nếu hexdump kết thúc bằng 0a
Smeterlink

1

Câu trả lời này là một bài đăng chéo từ https://stackoverflow.com/a/52834021/6770384

Bạn có thể thực hiện chuyển đổi trong một sedlệnh. Nó đủ để thêm :địa chỉ sau và thay đổi tuổi thọ (chuyển ab12sang 12ab).

sed -E 's/ /: /;s/ (..)(..)/ \2\1/g;$d' dump | xxd -r

Lỗi đã biết (xem phần bình luận)

  • Một byte null trailing được thêm vào nếu tệp gốc có độ dài lẻ (ví dụ: 1, 3, 5, 7, ..., byte dài).
  • Lặp lại các phần của tệp gốc không được khôi phục chính xác nếu chúng được chỉnh sửa hexdumpbằng cách sử dụng a  *.

không hoạt động nếu hexdump kết thúc bằng 0a
Smeterlink

@Smeterlink Cảm ơn bạn đã quan sát này! Bạn đã đúng: Lệnh này tạo ra một byte null trailing không có trong tệp gốc nếu độ dài tính bằng byte là một số lẻ. Tôi cũng tìm thấy một lỗi khác. hexdumpcó thể ẩn các phần lặp đi lặp lại bằng cách sử dụng a *. Lệnh này cũng không thể khôi phục các phần này một cách chính xác. Ví dụ: yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rchỉ in 8 ythay vì 100. Sửa những thứ này sẽ đòi hỏi nhiều hơn một lớp lót này. Có lẽ tôi thêm một kịch bản khác trong tương lai.
Socowi

cảm ơn vì tiền *boa, không biết!
Smeterlink
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.