سؤال

ومشكلتي هي أني أريد أن تحليل الملفات الثنائية من أنواع مختلفة مع محلل العام الذي يتم تنفيذه في JAVA. ربما يصف تنسيق الملف مع ملف التكوين الذي قرأه محلل أو إنشاء فئات Java التي تحليل الملفات وفقا لنوع من قواعد التوزيع.

ولقد بحثت قليلا جدا على شبكة الانترنت ولكن وجدت شيئا تقريبا حول هذا الموضوع.

ولقد وجدت ما ليست سوى الأشياء التي تتعامل مع المترجم مولدات (جاي، Cojen، الخ)، ولكن لا أعتقد أنني يمكن استخدامها لتوليد شيء لتحليل الملفات الثنائية. ولكن قد أكون مخطئا في هذا الافتراض.

هل هناك أي الأطر التي تتعامل خصوصا مع إعراب سهل من الملفات الثنائية أو يمكن لأي شخص أن تعطيني تلميحا كيف يمكن استخدام محلل / مترجم مولدات للقيام بذلك؟

على تحديث : في أنا أبحث عن شيء أين يمكنني إرسال ملف التكوين مثل

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

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

ووأنه يولد تلقائيا الأمر الذي يوزع الملفات التي تبدأ ب "MAGIC"، تليها عشرة أضعاف محتوى الحزمة (التي هي نفسها تتكون من بايت، وهو طويل وسلسلة 10 بايت).

على Update2 : في لقد وجدت شيئا مقارنة ما أنا أبحث عن " بانشاء "، ولكن للأسف هذا هو-الإطار بيثون . ربما هذا يساعد شخص ما للحصول على فكرة، ما أبحث عنه.

هل كانت مفيدة؟

المحلول

وتعطي في محاولة ل preon

نصائح أخرى

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;

  }


}

والبيانات فك:

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

واسمحوا لي أن أعرف إذا كنت تقوم بتشغيل في مشاكل.

ولقد استخدمت DataInputStream لقراءة الملفات الثنائية وأنا أكتب القواعد في جاوة. ؛) الملفات الثنائية يمكن أن يكون مجرد عن أي شكل لذلك ليس هناك قاعدة عامة لكيفية قراءتها

.

وأطر لا تجعل دائما أشياء أكثر بساطة. في قضيتك، ملف وصف أطول من رمز لمجرد قراءة البيانات باستخدام 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);
}

إذا كنت تريد أن يكون ملف التكوين هل يمكن استخدام ملف تكوين جافا. http://www.google.co.uk/search؟q=java + + تكوين ملف

مكتبة محلل combinator هو خيار. JParsec يعمل بشكل جيد، ولكن يمكن أن يكون بطيئا.

ولقد تم وضع إطار للجافا والذي يسمح لتحليل البيانات الثنائية HTTPS: // github.com/raydac/java-binary-block-parser في حالة أن كنت مجرد وصف هيكل ملف ثنائي بك في pseudolanguage

ويمكنك تحليل الملفات الثنائية مع موزعي مثل JavaCC . هنا يمكنك العثور على مثال بسيط. ربما انها قليلا أكثر صعوبة من تحليل ملفات نصية.

هل تبحث في العالم من موزعي. محلل الجيد هو ياك ، ويمكن أن يكون هناك ميناء منه لجافا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top