hexdump vs perbedaan format xxd

9

Saya sedang mencari cara melakukan hexdump terbalik dan menemukan xxd disebutkan. Namun, tampaknya tidak bekerja dengan mudah:

xxd -r hexdumpfile > binaryfile

Saya kemudian membandingkan perbedaan antara keluaran xxd infiledan hexdump infile, dan menemukan tiga perbedaan:

  1. Output xxd memiliki titik dua setelah alamat
  2. output xxd memiliki posisi dalam data terbalik (misalnya, 5a42dalam output hexdump menjadi 425adalam output xxd)
  3. Ada beberapa karakter tambahan setelah setiap baris

Saya hanya memiliki versi hexdumped file tertentu di server. Bagaimana saya bisa mendapatkan kembali data biner dengan benar menggunakan xxd?

tanon
sumber
Sedang mencari beberapa opsi dalam xxd untuk mengambil dalam format hexdump, tetapi untuk sekarang, berhasil melakukannya dengan beberapa operasi sed sederhana
tanon
Saya belum benar-benar menguji persis apa yang Anda tanyakan, tetapi coba xxd -p dan -b, -p sederhana -b adalah biner, juga -r Anda. Adapun urutan byte, itu harus dilakukan dengan big endian dan little endian, dan mungkin xxd tidak dapat membalikkan itu .. tapi itu terkait dengan bagaimana byte disimpan dalam file. Seperti halnya jika Anda memiliki file teks di notepad , Anda dapat menyimpannya sebagai unicode 16-bit big endian, atau little endian atau UTF-8 atau apa pun, dan Anda melihat perbedaannya dari xxd. Perintah od mungkin menampilkannya secara berbeda.
barlop
Untuk referensi di masa mendatang, hexdumpmemungkinkan Anda untuk memilih endianness yang digunakan dalam outputnya, yang dapat membuat ini lebih sederhana. (Kenapa sekarang? Menemukan pertanyaan Anda bermanfaat untuk sesuatu yang tidak berhubungan.)
jpaugh

Jawaban:

7

Tidak ada satu perintah pun yang saya tahu akan melakukan konversi, tetapi dapat dengan mudah dipecah menjadi beberapa langkah:

  1. Hapus alamat dari hexdumpoutput menggunakansed
  2. Konversi menjadi biner menggunakan xxd
  3. Konversi endian (misalnya, 5a42menjadi 425a) menggunakandd

Inilah perintah lengkapnya:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile
Tim
sumber
tidak berfungsi jika hexdump berakhir dengan 0a
Smeterlink
1

Jawaban ini adalah pos silang dari https://stackoverflow.com/a/52834021/6770384

Anda dapat melakukan konversi dalam satu sedperintah. Cukup menambahkan :alamat setelahnya dan mengubah endianness (beralih ab12ke 12ab).

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

Bug yang Dikenal (lihat bagian komentar)

  • Byte nol trailing ditambahkan jika file asli panjangnya aneh (mis. 1, 3, 5, 7, ..., byte panjang).
  • Bagian berulang dari file asli tidak dipulihkan dengan benar jika mereka hexdumpmenggunakan ed  *.
Socowi
sumber
tidak berfungsi jika hexdump berakhir dengan 0a
Smeterlink
@Smeterlink Terima kasih atas pengamatan ini! Anda benar: Perintah ini menghasilkan null byte tambahan yang tidak ada dalam file asli jika panjang dalam byte adalah angka ganjil. Saya juga menemukan bug lain. hexdumpdapat menyembunyikan bagian yang berulang menggunakan a *. Perintah ini juga tidak dapat mengembalikan bagian-bagian ini dengan benar. Contoh: yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rhanya mencetak 8 dan ybukannya 100. Memperbaiki hal-hal ini akan membutuhkan lebih dari satu-liner ini. Mungkin saya menambahkan skrip lain di masa depan.
Socowi
terima kasih atas *tipnya, tidak tahu!
Smeterlink