2016-07-22 9 views
4

にKaitai Structの切り詰められたログを解析するときに何か方法がありますか? フィールドを読み込むと(列挙型に指定)、そこには値がないので、NullPointer例外が発生します。 2はまだあり返信用Kaitai Struct:フォールトトレランスを達成するためにいくつかのフィールドを渡す

meta: 
    id: btsnoop 
    endian: be 
seq: 
    - id: header 
    type: header 
    - id: packets 
    type: packet 
    repeat: eos 
types: 
    header: 
    seq: 
     - id: iden 
     size: 8 
     - id: version 
     type: u4 
     - id: datalink_type 
     type: u4 
     enum: linktype 
    packet: 
    seq: 
     - id: ori_len 
     type: u4 
     - id: include_len 
     type: u4 
     - id: pkt_flags 
     type: u4 
     - id: cumu_drop 
     type: u4 
     - id: timestamp 
     type: s8 
     - id: data 
     size: include_len 
     type: frame 
    frame: 
    seq: 
     - id: pkt_type 
     type: u1 
     enum: pkttype 
     - id: cmd 
     type: cmd 
     if: pkt_type == pkttype::cmd_pkt 
     - id: acl 
     type: acl 
     if: pkt_type == pkttype::acl_pkt 
     - id: evt 
     type: evt 
     if: pkt_type == pkttype::evt_pkt 
    cmd: 
    seq: 
     - id: opcode 
     type: u2le 
     - id: params_len 
     type: u1 
     - id: params 
     size: params_len 
    acl: 
    seq: 
     - id: handle 
     type: u2le 
    evt: 
    seq: 
     - id: status 
     type: u1 
     enum: status 
     - id: total_length 
     type: u1 
     - id: params 
     size-eos: true 
enums: <-- I need to list all possible option in every enum? 
    linktype: 
    0x03E9: unencapsulated_hci 
    0x03EA: hci_uart 
    0x03EB: hci_bscp 
    0x03EC: hci_serial 
    pkttype: 
    1: cmd_pkt 
    2: acl_pkt 
    4: evt_pkt 
    status: 
    0x0D: complete_D 
    0x0E: complete_E 
    0xFF: vendor_specific 

感謝:)

答えて

3


は、だから私は、どのような方法は、Pythonライブラリで同じようdefault: pass属性はここConstruct

は私ksyファイルであることを達成するかどうか尋ねるたいですあなたがここで直面している質問:)

部分的な/切り捨てられた/破損したデータの解析

ここでの主な問題は、Kaitai Structが.ksyをクラスコンストラクタで実際の解析を行うコードにコンパイルすることです。それは、問題が発生した場合、ブーム、あなたは全く物体を持っていないことを意味します。ほとんどの使用例では、オブジェクトが完全に初期化されていることを実際に確認できるので、望ましい動作です。この問題は通常、フォーマットが次のプリミティブを読み込みたいときにはEOFExceptionですが、ストリームにはデータが残っていないか、さらに複雑な場合は別のものがあります。

しかし、あなたが言及したように、「ベストエフォート型」の解析が役立つ場合があります。つまり、半分のオブジェクトを入力しても問題ありません。そのためのもう1つの一般的な使用例は、ビジュアライザーです。結果が視覚化されるのではなく、視覚化されたユーザーの半分の結果を表示する方が良いので、ビジュアライザーも役立ちます。ユーザーに推測されている)。

Kaitai Structには簡単な解決策があります。--debugオプションでクラスをコンパイルできます。この方法で、オブジェクトの作成と解析を分離したクラスを取得し、解析はオブジェクトの別のメソッドになります(void _read())。ただし、これは、手動で解析メソッドを呼び出す必要があることを意味します。たとえば、あなたのオリジナルのコードだった場合:

Btssnoop b = Btssnoop.fromFile("/path/to/file.bin"); 
b._read(); 
System.out.println(b.packets.size()); 

、その後、あなたがAでそれをラップすることができます:あなたは--debugでそれをコンパイルした後

Btssnoop b = Btssnoop.fromFile("/path/to/file.bin"); 
System.out.println(b.packets.size()); 

、あなたは余分なステップを行う必要があるでしょう/ catchブロックを試してみて、実際にもIOExceptionを取得した後に処理を続行:

Btssnoop b = Btssnoop.fromFile("/path/to/file.bin"); 
try { 
    b._read(); 
} catch (IOException e) { 
    System.out.println("warning: truncated packets"); 
} 
System.out.println(b.packets.size()); 

いくつかのキャッチはいえ、あります

  • --debug Javaターゲットではリリースv0.3ではまだ使用できませんでした。実際には、それは公共のgitリポジトリでさえ今ではありません、私はすぐにそれをプッシュしたいと思います。
  • --debugも、すべての属性の位置を書き留めて、かなり厳しいパフォーマンス/メモリーペナルティを課すようないくつかの余分なことがあります。 --debug機能の残りの部分を除いて "別のコンストラクタ/解析"機能をコンパイルするためのスイッチが必要かどうか教えてください。
  • 到着時に着信パケットを継続的に解析する必要がある場合は、それらをすべてメモリに保存し、すべての更新時にそれらをすべて再解析することをお勧めします。私たちはイベントベースの解析モデルを検討しています。興味があるかどうか教えてください。

    private static final Map<Long, Animal> byId = new HashMap<Long, Animal>(3); 
    static { 
        for (Animal e : Animal.values()) 
         byId.put(e.id(), e); 
    } 
    public static Animal byId(long id) { return byId.get(id); } 
    

    Javaの地図のget戻り値:列挙値とNPE

    現在のJava実装が

    Animal.byIdがに翻訳され
    this.pet1 = Animal.byId(_io.readU4le()); 
    

    のようなものに読んで列挙型を変換がありません

null地図で値が見つからなかった場合、契約によって。そのヌルと何か(つまり他のenum値)を比較して、正しいtrueまたはfalseを得ることができるはずです。コード、生成されたコード、スタックトレースなどのNPEに問題がある場所を教えてください。

関連する問題