Skip to content

minatosato/binary-parser-with-xml

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Binary Parser with XML Configuration

XMLで定義された構造体を使用してバイナリデータを解析するシステムです。構造体定義が変更されても再コンパイルが不要です。

🎯 プロジェクトの目的

C++でバイナリデータを構造体にキャストする際、構造体定義が頻繁に変わると都度再コンパイルが必要になります。このプロジェクトは、構造体定義をXMLファイルとして外部化することで、この問題を解決します。

✅ 実装済み機能

1. Header to XML変換ツール(Python)

  • C++ヘッダファイルから構造体定義を抽出
  • XML形式で構造体情報を出力
  • 複雑なネスト構造、union、bitfield対応
  • マクロ展開機能(配列サイズ定義)

2. バイナリパーサー(C++)

  • XML定義を読み込んでバイナリデータを解析
  • 再コンパイル不要で構造体定義の変更に対応
  • エンディアン変換サポート(パフォーマンス最適化済み)
  • ビットフィールド値の抽出
  • JSON形式での出力サポート(自作ミニマルライブラリ使用)
  • char配列の自動文字列変換

3. サポートする機能

  • ✅ stdint型(uint8_t, int16_t, uint32_t等)
  • ✅ float, double, char
  • ✅ ネストした構造体
  • ✅ union(名前付き・無名)
  • ✅ 配列(マクロ展開対応、構造体配列含む)
  • ✅ bitfield
  • ✅ typedef構造体
  • ✅ #includeによる複数ヘッダファイル
  • ✅ パック/アンパック(アライメント制御)
  • ✅ エンディアン指定(little/big)
  • ✅ JSON出力(コンパクト/Pretty Print)
  • ✅ ファイル出力

🚀 使い方

1. ヘッダファイルをXMLに変換

python3 src/header_to_xml/header_to_xml.py input.h StructName -o output.xml

オプション:

  • -p, --packed: パックされた構造体として処理
  • -o, --output: 出力XMLファイル名を指定

2. バイナリデータを解析

./build/parse_binary output.xml data.bin

オプション:

  • --big-endian: ビッグエンディアンとして解析(デフォルトはリトルエンディアン)
  • --json: JSON形式で出力
  • --pretty: JSON出力を整形(インデント付き)
  • -o <file>: 出力をファイルに保存

🔧 ビルド方法

必要な環境

  • C++17対応コンパイラ
  • CMake 3.10以降
  • Python 3.6以降

ビルド手順

mkdir build
cd build
cmake ..
make

📁 ディレクトリ構成

binary-parser-with-xml/
├── src/
│   ├── header_to_xml/        # Python: ヘッダ→XML変換
│   │   └── header_to_xml.py
│   ├── binary_parser/        # C++: バイナリパーサー
│   │   ├── binary_parser.cpp
│   │   ├── binary_parser.h
│   │   ├── xml_struct_parser.cpp
│   │   ├── xml_struct_parser.h
│   │   ├── json_converter.cpp
│   │   ├── json_converter.h
│   │   └── main.cpp
│   └── json/                 # C++: JSONライブラリ
│       ├── json_value.cpp
│       └── json_value.h
├── tests/                    # テストコード
├── docs/                     # ドキュメント
├── CMakeLists.txt
└── README.md

📚 例

入力ヘッダファイル (example.h)

#include <stdint.h>

#define BUFFER_SIZE 32

struct ExampleStruct {
    uint32_t id;
    struct {
        uint16_t x;
        uint16_t y;
    } position;
    union {
        uint32_t value;
        uint8_t bytes[4];
    } data;
    uint8_t flags : 3;
    uint8_t mode : 5;
    char name[BUFFER_SIZE];
};

生成されるXML

<struct name="ExampleStruct" size="48">
  <field name="id" type="uint32_t" offset="0" size="4"/>
  <field name="position" offset="4" size="4">
    <struct>
      <field name="x" type="uint16_t" offset="0" size="2"/>
      <field name="y" type="uint16_t" offset="2" size="2"/>
    </struct>
  </field>
  <field name="data" offset="8" size="4">
    <union>
      <field name="value" type="uint32_t" offset="0" size="4"/>
      <field name="bytes" type="uint8_t" array_size="4" offset="0" size="4"/>
    </union>
  </field>
  <field name="flags" type="uint8_t" bits="3" bit_offset="0" offset="12" size="1"/>
  <field name="mode" type="uint8_t" bits="5" bit_offset="3" offset="12" size="1"/>
  <field name="name" type="char" array_size="32" offset="16" size="32"/>
</struct>

JSON出力例

./build/parse_binary example.xml data.bin --json --pretty
{
  "id": 12345,
  "position": {
    "x": 100,
    "y": 200
  },
  "data": {
    "value": 305419896,
    "bytes": [120, 86, 52, 18]
  },
  "flags": 5,
  "mode": 31,
  "name": "Hello, World!"
}

🧪 テスト

# ビルドとすべてのテストの実行
mkdir build
cd build
cmake ..
make
make test

# 個別のテスト実行
# Pythonテスト
python3 tests/test_header_to_xml.py
python3 tests/test_macro_expansion.py

# C++単体テスト
./build/run_tests

# 統合テスト
./tests/integration/run_integration_test.sh
./tests/integration/run_integration_test_with_json.sh
./tests/integration/run_complex_integration_test.sh

📝 制限事項

詳細はdocs/LIMITATIONS.mdを参照してください。

主な制限:

  • ポインタ型は未対応
  • 多次元配列は未対応
  • C++のクラス機能は未対応
  • enum型は未対応

🛠️ 開発

このプロジェクトはTDD + RGRC(Red, Green, Refactor, Commit)の手法で開発されています。

📄 ライセンス

このプロジェクトはオープンソースです。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •