Tôi không chắc là tôi hoàn toàn hiểu, nhưng có vẻ như bạn có một trình phân tích cú pháp cho định dạng nhị phân này và bạn kiểm soát mã cho nó. Vì vậy, câu trả lời này được xây dựng trên giả định đó.
Trình phân tích cú pháp theo một cách nào đó sẽ lấp đầy các cấu trúc, lớp hoặc bất kỳ cấu trúc dữ liệu nào mà ngôn ngữ của bạn có. Nếu bạn thực hiện một ToString
cho tất cả mọi thứ được phân tích cú pháp, thì bạn sẽ kết thúc bằng một phương pháp rất dễ sử dụng và dễ dàng duy trì để hiển thị dữ liệu nhị phân đó ở định dạng có thể đọc được.
Về cơ bản bạn sẽ có:
byte[] arrayOfBytes; // initialized somehow
Object obj = Parser.parse(arrayOfBytes);
Logger.log(obj.ToString());
Và đó là nó, từ quan điểm của việc sử dụng nó. Tất nhiên, điều này đòi hỏi bạn phải thực hiện / ghi đè ToString
hàm cho Object
lớp / struct / bất cứ thứ gì của bạn và bạn cũng sẽ phải làm như vậy đối với bất kỳ lớp / cấu trúc / trình tự lồng nhau nào.
Ngoài ra, bạn có thể sử dụng một câu lệnh có điều kiện để ngăn ToString
chức năng được gọi trong mã phát hành để bạn không lãng phí thời gian vào thứ gì đó sẽ không được ghi lại bên ngoài chế độ gỡ lỗi.
Bạn ToString
có thể trông như thế này:
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);
Câu hỏi ban đầu của bạn có vẻ như bạn đã cố gắng thực hiện điều này và bạn nghĩ rằng phương pháp này rất nặng nề, nhưng đôi khi bạn cũng đã thực hiện phân tích cú pháp định dạng nhị phân và tạo các biến để lưu trữ dữ liệu đó. Vì vậy, tất cả những gì bạn phải làm là in các biến hiện có ở mức độ trừu tượng thích hợp (lớp / struct của biến nằm trong).
Đây là điều bạn chỉ nên làm một lần và bạn có thể làm điều đó trong khi xây dựng trình phân tích cú pháp. Và nó sẽ chỉ thay đổi khi định dạng nhị phân thay đổi (điều này sẽ nhắc thay đổi đối với trình phân tích cú pháp của bạn).
Theo cách tương tự: một số ngôn ngữ có các tính năng mạnh mẽ để biến các lớp thành XML hoặc JSON. C # đặc biệt tốt ở đây. Bạn không phải từ bỏ định dạng nhị phân của mình, bạn chỉ cần thực hiện XML hoặc JSON trong một câu lệnh ghi nhật ký gỡ lỗi và để lại mã phát hành của bạn.
Cá nhân tôi khuyên bạn không nên đi theo đường kết xuất hex, bởi vì nó dễ bị lỗi (bạn đã bắt đầu ở byte bên phải chưa, bạn có chắc chắn khi bạn đọc từ trái sang phải mà bạn đang "nhìn thấy" độ chính xác, v.v.) .
Ví dụ: Nói các ToStrings
biến nhổ của bạn a,b,c,d,e,f,g,h
. Bạn chạy chương trình của mình và nhận thấy có lỗi g
, nhưng vấn đề thực sự bắt đầu với c
(nhưng bạn đang gỡ lỗi, vì vậy bạn chưa tìm ra điều đó). Nếu bạn biết các giá trị đầu vào (và bạn nên), bạn sẽ thấy ngay đó c
là vấn đề bắt đầu.
So với một bãi chứa hex chỉ cho bạn biết 338E 8455 0000 FF76 0000 E444 ....
; nếu các trường của bạn có kích thước khác nhau, c
bắt đầu từ đâu và giá trị là gì - trình soạn thảo hex sẽ cho bạn biết nhưng quan điểm của tôi là đây dễ bị lỗi và mất thời gian. Không chỉ vậy, nhưng bạn không thể dễ dàng / nhanh chóng tự động hóa một bài kiểm tra thông qua trình xem hex. In ra một chuỗi sau khi phân tích dữ liệu sẽ cho bạn biết chính xác chương trình của bạn đang 'nghĩ gì' và sẽ là một bước trong quá trình kiểm tra tự động.