2009-07-27 7 views
2

私は、テキストデータを扱うときに優れたFileHelpersライブラリを使用します。これは、ファイルやメモリ内の文字列からテキストフィールドを非常に簡単にデータを表すクラスにダンプすることができます。FileHelpersのようなバイナリデータのインポート/エクスポートユーティリティ?

ビッグエンディアンのマイクロコントローラベースのシステムでは、シリアルデータストリームを読み取る必要があります。非常に限られたマイクロコントローラプラットフォーム上のスペースを節約するために、私はさまざまなマルチバイトタイプのフィールドを含む生のバイナリデータを書く必要があります(基本的には、シリアルポートから構造変数をダンプするだけです)。

私はFileHelpersのアーキテクチャが好きです。私は、データを表すクラスを作成し、そのクラスにデータを入れる方法をエンジンに知らせる属性でタグ付けします。エンジンに単一のレコードを表す文字列を送り、データの逆シリアル化表現を得ることができます。しかし、これは、生データが決して区切られないという点でオブジェクトの直列化とは異なります。単純なバイナリの固定レコード形式です。

FileHelpersは、おそらくそれは、私はユニコードの問題があるかもしれないと疑う*表示と NULLを扱うことはできません ようなバイナリデータを読み込むには適していません(エンジンは、文字列として入力を受け取り、私はバイトを読まなければなりません彼らは私のデータコンバータのクラスに行く前に、シリアルポートからそれらをユニコード文字列に翻訳)。私がヌルを送信しないように注意している限り、私は実験としてバイナリストリームと を読むように設定しました。 これまでのところうまくいきます。生データを読み込んで新しいエンディアンの問題を説明する新しいコンバータを簡単にセットアップできます。現在 はNULLで失敗し、 は複数のレコードを処理できません(レコード間にCRLFが必要です)。

私が知りたいのは、誰かがFileHelpersと同様に動作するオープンソースライブラリを知っていて、バイナリデータを処理するように設計されていることです。

私はこのタスクを処理するためにFileHelpersから何かを派生することを検討していますが、これを行うためにすでに利用可能なものがあるはずです。

*入力ストリームではnullについては不平を言わないことが判明しました。テストプログラムに無関係のバグがありましたが、どこに問題があると思いますか?最初に少し深く調査したはずです!

答えて

0

私はfilehelpersを使用していないため、直接比較はできません。ただし、オブジェクトを表すオブジェクトモデルがある場合は、protobuf-netを試すことができます。 Googleのコンパクトな「プロトコルバッファ」ワイヤ形式を使用した.NET用のバイナリシリアル化エンジンです。 xmlのようなものよりもはるかに効率的ですが、独自のシリアル化コードをすべて記述する必要はありません。

「プロトコルバッファ」にはフィールド間の非常に簡潔なマーカー(通常は1バイト)が含まれています。これにより、少しののパディングが追加されますが、バージョンの許容差が大幅に向上します。 「パックされた」データ(すなわち、intのブロック、例えば配列からのもの)については、これは必要に応じて省略することができる。

so:コンパクトな出力をしたいだけなら、それは良いかもしれません。 の具体的な出力が必要な場合はおそらくそれほどです。

開示:私は著者ですので偏見があります。それは無料です。

+0

これは非常に軽量なデータを生成するためのコードであれば、理想的な解決策になりそうです。 私は、数キロバイトのストレージしか備えていないAVRマイクロコントローラベースのプラットフォームであるArduinoを使用しているため、スペースが最大の問題です。現時点では、書式設定なしでシリアルポートから構造体をダンプするだけで、オーバーヘッドは最小限に抑えられます。 C++プロトコルバッファライブラリが大規模で、8ビット環境にコンパイルできるかどうかは今考えていますか? – DaveK

+0

現時点では、スペース限定のシナリオでCバージョンを使用することをお勧めしますが、新しいスリムバージョンがリリースされています:http://groups.google.com/group/protobuf/browse_thread/thread/5520b05194d73d76# 。しかしそれでもまだそれは大きすぎるかもしれません。私は正直に分かりません。そして8ビットは...挑戦的です。残念ながら、私は「ノー」と疑っています。ごめんなさい。 –

0

私はGPSデータをSIRFstarIIIバイナリモードで操作しているときに、シリアルモジュールでPythonのインタラクティブプロンプトを使用してUSB /シリアルポートからストリームを取得し、struct moduleを使用してバイトを必要に応じて変換しますSIRFによって定義される)。対話型プロンプトを使用すると、文字列を変数に読み込み、処理し、結果を表示し、必要に応じて再試行できるため、非常に柔軟です。プロトタイピング段階が終了した後、私は最終的なプログラムに入れなければならないデータ形式の文字列を持っています。

あなたの質問にC#タグがある理由について何も言及していません。私はFileHelpersがC#ライブラリだと理解していますが、私はあなたがどのような環境で作業しているか教えてくれません。IronPythonというPython for .NETの実装があります。

私はこの答えが新しい言語を学ばなければならないかもしれないが、インタラクティブなプロンプトを持つことはプログラマーにとって非常に強力なツールだということを認識しています。

関連する問題