Saya memiliki file biner yang ingin saya sertakan dalam kode sumber C saya (untuk sementara waktu, untuk tujuan pengujian) jadi saya ingin mendapatkan konten file sebagai string C, sesuatu seperti ini:
\x01\x02\x03\x04
Apakah ini mungkin, mungkin dengan menggunakan od
atau hexdump
utilitas? Meskipun tidak perlu, jika string dapat membungkus ke baris berikutnya setiap 16 byte input, dan termasuk tanda kutip ganda pada awal dan akhir setiap baris, itu akan lebih baik!
Saya sadar bahwa string akan memiliki nulls tertanam ( \x00
) jadi saya perlu menentukan panjang string dalam kode, untuk mencegah byte ini mengakhiri string lebih awal.
Jawaban:
Anda hampir dapat melakukan apa yang Anda inginkan
hexdump
, tetapi saya tidak tahu bagaimana cara mendapatkan tanda kutip & backslash tunggal ke dalam format string. Jadi saya melakukan sedikit post-processing dengansed
. Sebagai bonus, saya juga membuat indentasi setiap baris dengan 4 spasi. :)Edit
Seperti yang ditunjukkan Cengiz Can, baris perintah di atas tidak sesuai dengan jalur data pendek. Jadi, inilah versi baru yang ditingkatkan:
Seperti yang disebutkan Malvineous dalam komentar, kita juga perlu memberikan
-v
opsi verbosehexdump
untuk mencegahnya menyingkat byte yang identik*
.sumber
-v
opsi kehexdump
, jika tidak berjalan lama dari byte input yang sama menyebabkan jalur output yang mengatakan"*"
.xxd
memiliki mode untuk ini. The-i
/--include
option akan:Anda dapat membuangnya ke file menjadi
#include
d, dan kemudian hanya mengaksesfoo
seperti array karakter lain (atau menautkannya ke dalam). Ini juga termasuk deklarasi panjang array.Outputnya dibungkus menjadi 80 byte dan pada dasarnya terlihat seperti apa yang Anda tulis dengan tangan:
xxd
agak aneh adalah bagian darivim
distribusi, jadi Anda mungkin sudah memilikinya. Jika tidak, di situlah Anda mendapatkannya - Anda juga dapat membuat alat sendiri darivim
sumbernya.sumber
objcopy
akan lebih baikobjcopy
akan memungkinkan OP untuk menautkan data biner dengan file yang dapat dieksekusi, yang berguna tetapi tidak persis apa yang diminta di sini.foo
/ difoo_len
sini, dan Anda tidak akan membuang-buang ruang penyimpanan. Saya yakin bahwa OP akan lebih baikobjcopy
dan cocok dengan kebutuhannya.objcopy
baik-baik saja ketika itu ada, tetapi tidak portabel dan hasilnya bahkan lebih sedikit. Ini tentu bisa menjadi bagian dari solusi permanen yang baik, tetapi itu bukan pertanyaan di sini.xxd
bagus tetapi hasilnya sangat verbose dan membutuhkan banyak ruang penyimpanan.Anda dapat mencapai hal yang sama dengan menggunakan praktis
objcopy
; misalnyaKemudian tautkan
foo.o
ke program Anda dan cukup gunakan simbol berikut:Ini bukan string literal, tetapi pada dasarnya sama dengan string literal berubah menjadi selama kompilasi (menganggap bahwa string literal sebenarnya tidak ada pada saat run-time; memang, tidak ada jawaban lain yang benar-benar memberi Anda string literal bahkan pada saat kompilasi) dan dapat diakses dengan cara yang hampir sama:
Kelemahannya adalah Anda perlu menentukan arsitektur target Anda untuk membuat file objek yang kompatibel, dan ini mungkin tidak sepele dalam sistem build Anda.
sumber
Seharusnya persis seperti yang Anda minta:
sumber
Ini adalah utilitas singkat yang saya tulis yang pada dasarnya melakukan hal yang sama (awalnya diposting di Stack Overflow ):
sumber
Jika Anda menggunakan python, muat ke dalam variabel "buff" dan gunakan sesuatu seperti ini:
sumber