2009-03-13 27 views
16

Vấn đề của tôi là, tôi muốn phân tích các tệp nhị phân của các loại khác nhau với một trình phân tích cú pháp chung được triển khai trong JAVA. Có thể mô tả định dạng tệp bằng tệp cấu hình được trình phân tích cú pháp đọc hoặc tạo các lớp Java phân tích cú pháp các tệp theo một số loại quy tắc phân tích cú pháp.Có bất kỳ khung công tác Java nào để phân tích cú pháp tệp nhị phân không?

Tôi đã tìm kiếm khá nhiều trên internet nhưng hầu như không tìm thấy chủ đề nào.

Những gì tôi đã tìm thấy chỉ là những thứ mà đối phó với trình biên dịch-máy phát điện (Jay, Cojen, vv) nhưng tôi không nghĩ rằng tôi có thể sử dụng chúng để tạo ra một cái gì đó để phân tích các tập tin nhị phân. Nhưng tôi có thể sai về giả định đó.

Có bất kỳ khung công tác nào đặc biệt với phân tích cú pháp tệp nhị phân dễ dàng hay bất kỳ ai có thể cho tôi gợi ý cách tôi có thể sử dụng trình phân tích cú pháp/trình tạo trình biên dịch để làm như vậy?

Cập nhật: Tôi đang tìm một cái gì đó mà tôi có thể viết một config-file như

file: 
    header: FIXED("MAGIC") 
    body: content(10) 

content: 
    value1: BYTE 
    value2: LONG 
    value3: STRING(10) 

và nó tạo ra tự động một cái gì đó mà phân tích các tập tin mà bắt đầu với "Magic", tiếp theo là gấp mười lần gói nội dung (bản thân nó bao gồm một byte, một chuỗi dài và 10 byte).

Update2: tôi tìm thấy một cái gì đó có thể so sánh những gì tôi đang tìm kiếm, "Construct", nhưng thật đáng buồn này là một Python-Framework. Có lẽ điều này giúp một người nào đó để có được một ý tưởng, những gì tôi đang tìm kiếm.

Trả lời

10

cung cấp cho một cố gắng để preon

+0

Vậy đó. Cảm ơn bạn! – Kosi2801

+0

Thật không may giấy phép là GPL. Cập nhật: Đây là phiên bản GPL 2. Xem tại đây để biết thêm thông tin: http://stackoverflow.com/questions/6698740/java-or-c-equivalents-to-preon – shader

+0

@shader - Là nhận xét về Câu hỏi đó, bạn có thể có được giấy phép thương mại nếu GPL không hoạt động cho bạn. –

10

Tôi đã sử dụng DataInputStream để đọc tệp nhị phân và tôi viết các quy tắc trong Java. ;) Các tệp nhị phân có thể có bất kỳ định dạng nào, do đó không có quy tắc chung nào về cách đọc chúng.

Khung không phải lúc nào cũng làm mọi việc đơn giản hơn. Trong trường hợp của bạn, tệp mô tả dài hơn mã để chỉ đọc dữ liệu bằng cách sử dụng DataInputStream.

public static void parse(DataInput in) throws IOException { 
//  file: 
//   header: FIXED("MAGIC") 
    String header = readAsString(in, 5); 
    assert header.equals("MAGIC"); 
//   body: content(10) 
// ?? not sure what this means 
//  content: 
    for(int i=0;i<10;i++) { 
//   value1: BYTE 
     byte value1 = in.readByte(); 
//   value2: LONG 
     long value2 = in.readLong(); 
//   value3: STRING(10) 
     String value3 = readAsString(in, 10); 
    } 
} 

public static String readAsString(DataInput in, int len) throws IOException { 
    byte[] bytes = new byte[len]; 
    in.readFully(bytes); 
    return new String(bytes); 
} 

Nếu bạn muốn có tệp cấu hình bạn có thể sử dụng Tệp cấu hình Java. http://www.google.co.uk/search?q=java+configuration+file

+1

1: Không có khuôn khổ. Không phân tích cú pháp dễ dàng. –

+2

Tôi biết rằng các tệp nhị phân có thể có bất kỳ định dạng nào, nhưng tệp PNG luôn có cùng cấu trúc, BMP luôn có cùng cấu trúc ... Điều tôi muốn là: tạo "mô tả" cho ví dụ. BMP tập tin, thức ăn nó vào khuôn khổ, nuôi một BMP và sau đó có dễ dàng truy cập vào từng yếu tố duy nhất của nội dung phân tích cú pháp. – Kosi2801

+0

Kosi2801: Nếu bạn có thể viết đặc điểm kỹ thuật hoặc chỉ là một serie của "làm thế nào nó thực sự hoạt động" các bước cho khuôn khổ như vậy, sau đó nó hoàn toàn khả thi. Nếu bạn không thể, nó không phải. – Esko

-3

Bạn đã xem xét thế giới của các trình phân tích cú pháp. Trình phân tích cú pháp tốt là yacc và có thể có một cổng của trình phân tích cú pháp cho java.

-2

Bạn có thể phân tích cú pháp các tệp nhị phân với các trình phân tích cú pháp như JavaCC. Here bạn có thể tìm thấy một ví dụ đơn giản. Có lẽ đó là một chút khó khăn hơn so với phân tích cú pháp các tập tin văn bản.

1

Thư viện trình kết hợp phân tích cú pháp là một tùy chọn. JParsec hoạt động tốt, tuy nhiên nó có thể chậm.

3

của Google Protocol Buffers

+1

Đã có một cái nhìn ngắn về nó nhưng có vẻ như không cung cấp quyền truy cập bit vào nội dung luồng dữ liệu nhưng đóng gói nó bằng cách nào đó (để cung cấp tùy chọn, v.v.). Giả định của tôi cũng được hỗ trợ bởi vì nó có vẻ là cần thiết để sử dụng Protocol Buffers trên cả hai đầu của kênh comm. – Kosi2801

12

Sử dụng Preon:

public class File { 

    @BoundString(match="MAGIC") 
    private String header; 

    @BoundList(size="10", type=Body.class) 
    private List<Body> body; 

    private static class Body { 

    @Bound 
    byte value1; 

    @Bound 
    long value2; 

    @BoundString(size="10") 
    String value3; 

    } 


} 

giải mã dữ liệu:

Codec<File> codec = Codecs.create(File.class); 
File file = codecs.decode(codec, buffer); 

Hãy cho tôi biết nếu bạn đang chạy vào vấn đề.

0

tôi đã phát triển một khuôn khổ cho Java cho phép để phân tích dữ liệu nhị phân https://github.com/raydac/java-binary-block-parser trong trường hợp bạn chỉ nên mô tả cấu trúc của tập tin nhị phân của bạn trong pseudolanguage

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