2009-10-13 10 views
5

Tôi đã được yêu cầu xử lý một số tệp được tuần tự hóa dưới dạng nhị phân (không phải văn bản/JSON), nhưng tôi không có quyền truy cập vào chương trình hoặc lập trình viên đã tạo tệp, vì vậy tôi không biết cấu trúc của chúng, thứ tự trường, vv Có cách nào bằng cách sử dụng thư viện Tiết kiệm để mở tệp nhị phân và phân tích tệp, nhận danh sách các loại trường, giá trị, lồng nhau, v.v ... không?Làm thế nào bạn có thể đảo ngược thiết kế một tệp tiết kiệm nhị phân?

+0

Tôi giả sử bạn đang nói về http://incubator.apache.org/thrift/ - bạn có thể muốn đăng/gắn thẻ ngôn ngữ bạn đang sử dụng. – TrueWill

Trả lời

7

Rất tiếc, dường như giao thức nhị phân của Thrift không thực hiện gắn thẻ dữ liệu nhiều; để giải mã nó xuất hiện để giả sử bạn có tệp .thrift trong tay, vì vậy bạn biết, 4 byte tiếp theo được cho là một số nguyên và không thực sự là nửa đầu tiên của phao. Vì vậy, nó xuất hiện bạn đang mắc kẹt với, về cơ bản, nhìn vào các tập tin trong một trình soạn thảo hex (hoặc tương đương) và cố gắng suy ra các lĩnh vực dựa trên các mẫu chính xác mà bạn đang nhìn thấy.

Có một số bit rất hữu ích:

Mỗi tệp bắt đầu bằng phiên bản, chuỗi định danh giao thức và số thứ tự. Bản đồ sẽ bắt đầu với 6 byte xác định các loại khóa và giá trị (hai byte đầu tiên, dưới dạng số nguyên) cộng với số phần tử dưới dạng số nguyên 4 byte. Các mã kiểu xuất hiện là tiêu chuẩn (vị trí chuẩn của các định nghĩa của chúng có vẻ là TProtocol.h trong các nguồn tiết kiệm, ví dụ một giá trị boolean được chỉ định bởi mã loại 2, chuỗi UTF-8 theo loại mã 16, vv) . Các chuỗi được đặt trước bởi trường có độ dài nguyên 4 byte và các danh sách được đặt trước theo loại (1 byte) và độ dài 4 byte. Có vẻ như tất cả các trường số nguyên đều được lưu trữ lớn, và các điểm trôi nổi được lưu ở định dạng IEEE (điều này sẽ giúp cho việc tăng gấp đôi tương đối dễ tìm, ít nhất).

Tệp TBinaryProtocol * trong Tiết kiệm có một vài chi tiết hữu ích khác; về mặt tích cực, có một số cách triển khai khác nhau để bạn có thể đọc những triển khai được thực hiện bằng ngôn ngữ bạn cảm thấy thoải mái nhất.

Xin lỗi, tôi biết điều này có thể không hữu ích nhưng nó thực sự xuất hiện đây là tất cả thông tin mà định dạng nhị phân tiết kiệm cung cấp; rõ ràng định dạng nhị phân được thiết kế với mục đích là bạn luôn biết chính xác giao thức chính xác, và mục tiêu là không gian dây tối thiểu, thay vì làm cho nó dễ dàng giải mã một cách mù quáng.