Saya tidak yakin saya mengerti sepenuhnya, tetapi sepertinya Anda memiliki parser untuk format biner ini, dan Anda mengontrol kode untuk itu. Jadi jawaban ini dibangun di atas asumsi itu.
Pengurai dalam beberapa cara akan mengisi struct, kelas, atau struktur data apa pun yang dimiliki bahasa Anda. Jika Anda menerapkan a ToString
untuk semua yang diurai, maka Anda berakhir dengan metode yang sangat mudah digunakan dan mudah dipelihara menampilkan data biner dalam format yang dapat dibaca manusia.
Anda pada dasarnya akan memiliki:
byte[] arrayOfBytes; // initialized somehow
Object obj = Parser.parse(arrayOfBytes);
Logger.log(obj.ToString());
Dan itu saja, dari sudut pandang menggunakannya. Tentu saja ini mengharuskan Anda mengimplementasikan / menimpa ToString
fungsi untuk Object
kelas / struct / apa pun Anda, dan Anda juga harus melakukannya untuk setiap kelas / struct / nate yang bersarang.
Anda juga dapat menggunakan pernyataan bersyarat untuk mencegah ToString
fungsi dipanggil dalam kode rilis sehingga Anda tidak membuang waktu untuk sesuatu yang tidak akan dicatat di luar mode debug.
Anda ToString
mungkin terlihat seperti ini:
return String.Format("%d,%d,%d,%d", int32var, int16var, int8var, int32var2);
// OR
return String.Format("%s:%d,%s:%d,%s:%d,%s:%d", varName1, int32var, varName2, int16var, varName3, int8var, varName4, int32var2);
Pertanyaan awal Anda membuatnya terdengar seolah-olah Anda agak berusaha melakukan ini, dan Anda merasa metode ini memberatkan, tetapi Anda juga pada beberapa titik telah mengimplementasikan parsing format biner dan membuat variabel untuk menyimpan data itu. Jadi yang harus Anda lakukan adalah mencetak variabel-variabel yang ada pada tingkat abstraksi yang sesuai (kelas / struct variabel berada).
Ini adalah sesuatu yang harus Anda lakukan sekali saja, dan Anda bisa melakukannya sambil membangun parser. Dan itu hanya akan berubah ketika format biner berubah (yang sudah akan meminta perubahan ke parser Anda).
Dalam nada yang sama: beberapa bahasa memiliki fitur yang kuat untuk mengubah kelas menjadi XML atau JSON. C # sangat pandai dalam hal ini. Anda tidak harus menyerahkan format biner Anda, cukup lakukan XML atau JSON dalam pernyataan debug logging dan biarkan kode rilis Anda sendiri.
Saya pribadi merekomendasikan untuk tidak menggunakan hex dump route, karena rawan kesalahan (apakah Anda memulai pada byte yang tepat, apakah Anda yakin ketika Anda membaca dari kiri ke kanan bahwa Anda "melihat" endianness yang benar, dll.) .
Contoh: Katakan ToStrings
variabel meludah Anda a,b,c,d,e,f,g,h
. Anda menjalankan program dan melihat adanya bug g
, tetapi masalahnya benar-benar dimulai c
(tetapi Anda sedang melakukan debug, jadi Anda belum mengetahuinya). Jika Anda tahu nilai input (dan Anda harus) Anda akan langsung melihat di c
situlah masalah dimulai.
Dibandingkan dengan hex dump yang hanya memberitahu Anda 338E 8455 0000 FF76 0000 E444 ....
; jika bidang Anda memiliki ukuran yang bervariasi, di mana c
dimulai dan apa nilainya - editor hex akan memberi tahu Anda, tetapi poin saya adalah ini rawan kesalahan dan memakan waktu. Tidak hanya itu, tetapi Anda tidak dapat dengan mudah / cepat mengotomatiskan pengujian melalui penampil hex. Mencetak string setelah mem-parsing data akan memberi tahu Anda dengan tepat apa yang 'dipikirkan' program Anda, dan akan menjadi satu langkah di sepanjang jalur pengujian otomatis.