ฉันไม่แน่ใจว่าฉันเข้าใจอย่างถ่องแท้ แต่ดูเหมือนว่าคุณมีตัวแยกวิเคราะห์สำหรับรูปแบบไบนารีนี้และคุณสามารถควบคุมรหัสได้ ดังนั้นคำตอบนี้ถูกสร้างขึ้นบนสมมติฐานนั้น
ตัวแยกวิเคราะห์จะใช้วิธีเติมข้อมูลในคลาสคลาสหรือโครงสร้างข้อมูลใด ๆ ที่ภาษาของคุณมี หากคุณใช้ a ToString
สำหรับทุกอย่างที่วิเคราะห์คำแล้วคุณจะจบลงด้วยวิธีที่ใช้งานง่ายและบำรุงรักษาง่ายในการแสดงข้อมูลไบนารีนั้นในรูปแบบที่มนุษย์อ่านได้
คุณต้องมี:
byte[] arrayOfBytes; // initialized somehow
Object obj = Parser.parse(arrayOfBytes);
Logger.log(obj.ToString());
และนั่นคือจากมุมมองของการใช้งาน ของหลักสูตรนี้คุณต้องใช้ / แทนที่ToString
ฟังก์ชั่นสำหรับObject
ชั้นเรียนของคุณ/ struct / อะไรก็ตามและคุณจะต้องทำเช่นนั้นสำหรับชั้นเรียนซ้อน / structs / whatevers ใด ๆ
คุณสามารถใช้คำสั่งแบบมีเงื่อนไขเพิ่มเติมเพื่อป้องกันไม่ให้ToString
ฟังก์ชันถูกเรียกใช้ในรหัสการเผยแพร่เพื่อที่คุณจะได้ไม่ต้องเสียเวลากับบางสิ่งที่จะไม่ถูกบันทึกนอกโหมดการดีบัก
คุณToString
อาจมีลักษณะเช่นนี้:
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);
คำถามเดิมของคุณทำให้ดูเหมือนว่าคุณพยายามทำเช่นนี้และคุณคิดว่าวิธีนี้เป็นภาระ แต่คุณก็ยังนำไปใช้ในการแยกวิเคราะห์รูปแบบไบนารีและสร้างตัวแปรเพื่อเก็บข้อมูลนั้น ดังนั้นสิ่งที่คุณต้องทำคือพิมพ์ตัวแปรที่มีอยู่เหล่านั้นในระดับที่เหมาะสมของนามธรรม (class / struct ตัวแปรอยู่ใน)
นี่คือสิ่งที่คุณควรทำเพียงครั้งเดียวและคุณสามารถทำได้ในขณะที่สร้างเครื่องมือแยกวิเคราะห์ และมันจะเปลี่ยนเฉพาะเมื่อรูปแบบไบนารีเปลี่ยนแปลง (ซึ่งจะแจ้งให้มีการเปลี่ยนแปลงตัวแยกวิเคราะห์ของคุณอยู่แล้ว)
ในหลอดเลือดดำที่คล้ายกัน: บางภาษามีคุณสมบัติที่แข็งแกร่งสำหรับการเปลี่ยนคลาสเป็น XML หรือ JSON C # ดีมากในเรื่องนี้ คุณไม่จำเป็นต้องเลิกใช้รูปแบบไบนารีของคุณเพียงแค่ทำ XML หรือ JSON ในคำสั่งการบันทึกการดีบักและปล่อยรหัสการปล่อยของคุณเพียงอย่างเดียว
ฉันเองไม่แนะนำให้ไปตามเส้นทางการถ่ายโอนข้อมูลแบบ hex เพราะมีแนวโน้มที่จะเกิดข้อผิดพลาด (คุณเริ่มจากไบต์ที่ถูกต้องคุณแน่ใจหรือไม่ว่าคุณกำลังอ่านจากซ้ายไปขวาว่าคุณ "เห็น" endianness ที่ถูกต้อง ฯลฯ ) .
ตัวอย่าง: สมมติว่าคุณคายออกตัวแปรToStrings
a,b,c,d,e,f,g,h
คุณเรียกใช้โปรแกรมของคุณและสังเกตเห็นข้อบกพร่องด้วยg
แต่ปัญหาเริ่มต้นด้วยจริง ๆc
(แต่คุณกำลังดีบั๊กดังนั้นคุณยังไม่พบปัญหานั้น) หากคุณทราบค่าอินพุต (และคุณควร) คุณจะเห็นทันทีว่าc
เกิดจากปัญหาใด
เมื่อเทียบกับการถ่ายโอนข้อมูลฐานสิบหกที่เพิ่งจะบอกคุณ338E 8455 0000 FF76 0000 E444 ....
; ถ้าเขตข้อมูลของคุณมีขนาดแตกต่างกันจะc
เริ่มต้นที่ไหนและมีค่าอะไร - ตัวแก้ไขฐานสิบหกจะบอกคุณ แต่ประเด็นของฉันคือข้อผิดพลาดง่ายและใช้เวลานาน ไม่เพียงแค่นั้น แต่คุณไม่สามารถทำการทดสอบอัตโนมัติได้อย่างง่ายดายผ่านมุมมองฐานสิบหก การพิมพ์สตริงหลังจากวิเคราะห์ข้อมูลจะบอกคุณว่าโปรแกรมของคุณ 'คิด' และจะเป็นหนึ่งในเส้นทางการทดสอบอัตโนมัติ