問題タブ [binary-deserialization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
460 参照

c# - BinaryFormatter OptionalField with ISerializable

テストのシリアル化可能なオブジェクトを作成します。

そして、それをシリアル化します:

OptionalFied を持つようにクラスを変更し、古いシリアル化されたオブジェクトを逆シリアル化しようとします。

新しいオプション フィールドを読み取るようにコンストラクターを変更すると、"SecondName = info.GetString("secondName");" で例外がスローされます。

ISerializable を実装するときに OptionalFieldAttribute が実際にはサポートされていないということですか?

0 投票する
0 に答える
77 参照

vb.net - 逆シリアル化中に解析が完了する前にストリームの終わりが検出されました

BinaryFile を Object に逆シリアル化しているときに上記のエラーが発生します。set position=0、seek.begin メソッドを試しましたが、メモリ ストリームで試しましたが、使用できませんでした。毎回同じ問題が発生します。誰でも私を助けることができますか?. 以下は、シリアライゼーションとデシリアライゼーションのコード スニペットです。

シリアル化

逆シリアル化

0 投票する
1 に答える
1677 参照

python - Python でバイナリ プロトコルをデコードする

sdrdaemonというプログラムから生成されたバイナリストリームをデコードする単純な python クライアントを作成しようとしています。

プロトコルはここで説明されています(便宜上、以下にコピーされています)。私の理解では、最初の 42 バイトには、python構造体モジュールで読み取り/デコードすると考えていたメタ フレームが含まれている必要があります。

私は非常に単純なことから始めました。

ただし、この種のことについては、同期する方法を理解するのに十分なほど慣れていないため、正しいセクションをデコードしています。以下の説明はCRCを指していますが、どうすればよいかわかりません。少しのガイダンスは素晴らしいでしょう。github の問題に応答がありませんでした。

プロトコルの完全な説明はここにありますが、以下にもコピーされています。

包装

ハードウェア デバイスから取得されたデータのブロックは、UDP ペイロード サイズのブロックにスライスされます。以下、この一連のブロックを「フレーム」と呼びます。「メタ」ブロックと呼ばれる特別なブロックがフレームの前に送信されます。フレームとそれに続くデータに関する「メタ」データを伝達するために使用されます。この「メタ」データに対して 64 ビットの CRC が計算され、追加されます。これは検証として機能し、データ ブロックから「メタ」ブロックを認識して同期を実現します。それをデータブロックと混同する可能性は事実上非常に低いです。

圧縮ストリームは、圧縮効率を向上させるために、ハードウェアから取得した複数のデータ ブロックを 1 つのフレームにパックする場合があります。そのため、メタデータの変更が同じフレーム内の 1 つの「ハードウェア」ブロックから次のブロックに発生する場合があります。この場合、フレームが分割され、メタデータが変更されたブロックの開始「メタ」ブロックで新しいフレームが構築されます。元のフレームの最初の部分が UDP 経由ですぐに送信されます。これにより、データ フレームとその「メタ」ブロックが常に一貫していることが保証されます。

メタデータ ブロック

「メタ」データのブロックは、次のもので構成されます (値はバイト単位で表されます)。

メタブロック - パッキングなし

合計サイズは、8 バイトの CRC を含めて 42 バイトです。

データブロック

ストリームが圧縮されていない場合、ペイロード サイズの UDP ブロックに完全な I/Q サンプルが詰め込まれ、ブロックの最後に I/Q サンプル未満の未使用のギャップが残る可能性があります。最後のブロックは、残りのサンプルのみで埋められます。最後のブロックで最大に満たされたブロックと残りのサンプルの数は、「メタ」データで指定されます。もちろん、データ ストリームは圧縮されていないため、これらの値はサンプルの総数とペイロード サイズから計算することもできます。

ストリームが圧縮されると、UDP ブロックは圧縮ストリームのバイトで完全に詰め込まれます。最後のブロックは、残りのバイトのみで満たされています。完全なブロック数と残りのバイト数は「メタ」ブロックで指定され、これらの値はそれ以外では計算できません。

まとめ図

非圧縮ストリーム

編集::投稿後すぐにこのアプローチを (SoapySDR を支持して) 放棄することになるため、関連するコメントはもうできません。

0 投票する
1 に答える
49 参照

c# - 分析を完了する前に、終了ストリームが検出されました

それはまた私であり、私には別の問題があります。どこかで、次のコードを見つけました。

今日いくつかのクラスを変更しましたが、常にエラーがスローされます。これは次のように翻訳できます: Before completing the analysis was detected ending stream(正しい翻訳がわからない。エラー メッセージは英語ではなく私の言語で表示されます)

ここのどこかで見つけたstr.Position = 0;のこれらの 2 行の間に挿入しようとしましたが、役に立ちません。using

誰かがそれを再び機能させるのを手伝ってもらえますか? 私は何をすべきか分かりません...

0 投票する
1 に答える
373 参照

binary-serialization - ワイヤ プロトコルのシリアル化

「バイナリ シリアライザー/デシリアライザー コード ジェネレーター」と呼ぶものを探しています。具体的には、任意のビット長でオンザワイヤ フォーマットを指定し、必要な C/C++ を生成できる、より適切な用語がないためです。その形式でパケットをパック/アンパックするコード。私はビットフィールドを持つ構造体を使用する道を歩み始めましたが、この投稿を読んだ後、すべての厄介な問題を処理する何かがすでにそこにあるのではないかと思っています. 対処する必要があるデータ構造の例:

データ構造のフィールドをそのように保持する動機は、プログラマーがプロトコルで一致するものに基づいてフィールドを設定/取得しやすくすることです。val5 は、意味のある 3 ビット フラグである可能性があります。はい、構造体全体に対して 2 つの 32 ビット値を持つことができ、すべてを追跡するためにビット マスクなどを使用する必要がありますが、なぜですか?

Google Proto Buf などのことは知っていますが、私の知る限り、これらはすべてプログラマー側のデータ構造に焦点を当てており、特定のビット パターンを指定することはできません。バイナリ ワイヤ形式は、その指定方法です。私が見つけた最も近いものはprotlrで、FOSSのように見えないことを除けば素晴らしい音です。SO に関する他の投稿は次のとおりです。

  • 本格的な組み込みフレームワークの一部のように見えるRedBlocks 。
  • 私のニーズに対して非常に古く、過度に複雑に見えるPADS 。
  • 興味深いように聞こえるが、それを使用して任意のビット長(1ビット、2ビット、17ビットフィールドなど)を解析する例や、一方向の逆シリアル化に焦点を当てているように見えるため、シリアル化方法もある場合は見つかりません侵入検知用。

さらに別のシリアライゼーション形式をローリングする以外に、私の基準を満たす FOSS の代替手段はありますか、または上記の構造のこれらの参照の 1 つを使用して例を提供できますか?