2010-03-11 29 views
13

Parsec được thiết kế để phân tích thông tin văn bản, nhưng nó xảy ra với tôi rằng Parsec cũng có thể phù hợp để phân tích định dạng tệp nhị phân cho các phân đoạn phức tạp có liên quan đến phân đoạn có điều kiện, phân đoạn không theo thứ tự, v.v.Sử dụng Parsec của Haskell để phân tích các tệp nhị phân?

Có một khả năng để làm điều này hoặc một gói tương tự, thay thế thực hiện điều này? Nếu không, cách tốt nhất trong Haskell để phân tích các định dạng tệp nhị phân là gì?

Trả lời

10

Bạn có thể quan tâm đến số AttoParsec, được thiết kế cho mục đích này, tôi nghĩ vậy.

2

Nó hoạt động tốt, mặc dù bạn có thể muốn sử dụng Parsec 3, Attoparsec hoặc Iterate. Sự phụ thuộc của Parsec vào String như là biểu diễn trung gian của nó có thể làm nổi bật bộ nhớ của bạn khá nhiều, trong khi những người khác có thể được cấu hình để sử dụng ByteStrings. Các mẫu Iterate đặc biệt hấp dẫn bởi vì nó dễ dàng hơn để đảm bảo chúng sẽ không giữ được đầu của đầu vào của bạn và có thể được cho ăn từng khối dữ liệu khi chúng có sẵn. Điều này ngăn cản bạn phải đọc toàn bộ đầu vào vào bộ nhớ trước và cho phép bạn tránh các cách giải quyết khó chịu khác như IO lười biếng.

+1

Parsec đó là trong Text.Parsec ngụ ý nó là chủ yếu cho văn bản, không phải nhị phân, phải không? Ngay cả đối với ByteStrings, nó chỉ làm cho loại một thể hiện của Stream và Char. Những gì bạn có nghĩa là nó hoạt động tốt? – me2

1

Cách tiếp cận tốt nhất tùy thuộc vào định dạng của tệp nhị phân.

Nhiều định dạng nhị phân được thiết kế để dễ dàng phân tích cú pháp (không giống như định dạng văn bản chủ yếu được đọc bởi con người). Vì vậy, bất kỳ loại dữ liệu công đoàn nào sẽ được bắt đầu bởi một phân biệt đối xử cho bạn biết loại mong đợi nào, tất cả các trường đều có độ dài cố định hoặc trước bởi một trường độ dài, v.v. Đối với loại dữ liệu này tôi muốn giới thiệu Data.Binary; thông thường bạn tạo một kiểu dữ liệu Haskell phù hợp cho mỗi loại trong tệp, và sau đó làm cho mỗi loại đó là một thể hiện của Nhị phân. Xác định phương thức "get" để đọc; nó trả về một hành động đơn giản "Get" mà về cơ bản là một trình phân tích cú pháp rất đơn giản. Bạn cũng cần xác định phương thức "put".

Mặt khác, nếu dữ liệu nhị phân của bạn không phù hợp với loại thế giới này thì bạn sẽ cần attoparsec. Tôi chưa bao giờ sử dụng nó, vì vậy tôi không thể bình luận thêm, nhưng this blog post là rất tích cực.

12

Các công cụ quan trọng để phân tích tập tin nhị phân là:

Binary sự là giải pháp chung nhất, ngũ cốc có thể là tuyệt vời cho kích thước dữ liệu hạn chế, và attoparsec là hoàn toàn tốt cho ví dụ phân tích cú pháp gói. Tất cả những điều này nhằm vào hiệu suất rất cao, không giống như Parsec. Có rất nhiều ví dụ về hackage là tốt.

+0

Tôi nghĩ attoparsec là con đường để đi, nhưng tôi đang gặp khó khăn trong việc tìm kiếm các ví dụ về phân tích cú pháp dữ liệu nhị phân thực tế. Ví dụ duy nhất là RFC2616.hs được bao gồm trong kho lưu trữ nhưng vẫn phân tích văn bản, chứ không phải nhị phân. Bất kỳ đề xuất? – me2

+0

attoparsec chỉ được đề xuất gần đây để phân tích cú pháp dữ liệu nhị phân. Tại nơi làm việc, chúng tôi đi với Data.Binary và ngũ cốc. Có nhiều ví dụ hơn ở đó, và đó là những gì nó được thiết kế cho. attoparsec có thể tổng quát hơn bạn cần. –

Các vấn đề liên quan