Bagaimana cara membuat dump hex file yang hanya berisi karakter hex tanpa spasi di bash?

Jawaban:

250

xxd -p file

Atau jika Anda ingin semuanya dalam satu baris:

xxd -p file | tr -d '\n'

mark4o
sumber
13
fyi Untuk membalikkan proses: xxd -r -ps hexascii.txt file (tidak apa-apa dengan atau tanpa baris baru)
Curtis Yallop
92

Format string dapat membuat hexdump berperilaku tepat seperti yang Anda inginkan (tanpa spasi sama sekali, byte demi byte):

hexdump -ve '1/1 "%.2x"'

1/1berarti "setiap format diterapkan satu kali dan mengambil satu byte", dan "%.2x"merupakan format string yang sebenarnya, seperti pada printf. Dalam hal ini: angka heksadesimal 2 karakter, memimpin nol jika lebih pendek.

Michał Trybus
sumber
7
Anda memerlukan -vatau itu akan menjatuhkan byte berulang dan menggantinya dengan tanda bintang.
Dijeda sampai pemberitahuan lebih lanjut.
2
Saya ingin tahu apakah hexdump itu sendiri dapat menambahkan baris baru (hanya) ke akhir output .. (pelengkap jelas ; echomembuatnya tidak mungkin digunakan sebagai bash alias)
mykhal
2
Alias ​​saya:alias to_hex="hexdump -ve '1/1 \"%.2x\"' && echo"
devstuff
Hitungan iterasi dan byte dihitung sebagai default, jadi 1/1 dapat dihilangkan, meninggalkanhexdump -ve '"%.2x"'
Alex Che
@ mykhal, itu mungkin, jika Anda tahu jumlah byte dalam output. Katakanlah jika Anda menggunakan hexdump untuk hanya menghasilkan 13 byte pertama:hexdump -n 13 -e '13/1 "%.2x" "\n"'
Alex Che
24

Tampaknya tergantung pada detail versi od. Di OSX, gunakan ini:

od -t x1 -An file |tr -d '\n '

(Itu dicetak sebagai tipe hex byte, tanpa alamat. Dan spasi putih dihapus setelahnya, tentu saja.)

Donal Fellows
sumber
1
Saya juga akan menambahkan -vdalam konteks ini, kalau tidak lewati dengan berulang *.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
10

Perl one-liner:

perl -e 'local $/; print unpack "H*", <>' file
Alan Haggai Alavi
sumber
Diverifikasi. Cocok dengan "xxd -p file | tr -d '\ n'".
Curtis Yallop
1
fyi Untuk membalikkan proses: perl -e 'local $ /; paket cetak "H *", file <> '<hexascii.txt>
Curtis Yallop
"$ /" Lokal tidak perlu.
Curtis Yallop
Perbarui ke komentar terakhir: "$ lokal /" tidak diperlukan untuk "paket". Untuk membongkar, Anda memerlukannya tetapi bisa juga dengan kata lain "undef $ /". $ / adalah pemisah baris (default NL). undefined memasukkannya ke mode-slurp. Jadi <> direferensikan dalam konteks string menarik seluruh file biner tanpa menguraikannya menjadi beberapa baris.
Curtis Yallop
Formulir alternatif: perl -e 'print unpack "H *", join ("", <>)' <file
Curtis Yallop
2

Jawaban lainnya lebih disukai, tetapi untuk solusi Bash murni, saya telah memodifikasi skrip dalam jawaban saya di sini untuk dapat menghasilkan aliran hex karakter yang mewakili konten file. (Mode normalnya adalah untuk meniru hexdump -C.)

Dijeda sampai pemberitahuan lebih lanjut.
sumber