FASTプロトコル解析(1) FASTコーデックの簡単な例

 ナンセンス

検索できるドキュメントは髪の毛よりも少なく、これを専門に解析する OpenFast パッケージ (C++ は QuickFast) はありますが、公式 Web サイトは開くことができず、検索は風力発電のシミュレーション (いわゆる風力発電シミュレーション) のものでいっぱいです。 OpenFast という名前)。

OpenFastのソースコード+パッケージ+ドキュメントをダウンロードしたとしても、これが自分の欲しいものなのかどうかも分からず、とにかく頭が痛いです。

大衆の理解

FAST プロトコルについては、「FAST 1.1 仕様中国語版全文リファレンス」で詳細が確認できるので、一読することをお勧めします。原理を理解する必要がなくても、必ず読む必要があります。どのタイプがサポートされているかを知りたい場合は、本を参照してください。

平たく言えば、パッケージ化とアンパックは、高速圧縮および解凍アルゴリズム、または一般にシリアル化として知られるアルゴリズムとして理解できます。Json文字列を使用するとシンボルの冗長性など問題が多く、getリクエストの値の転送方法を使っても長い文字列になり、データ量が多いとトラフィックが発生します。帯域幅や遅延などを考慮すると、最適解はもちろん 8 ビットのバイトです。最初のビットは 0 が何で、1 が何で、2 番目のビットが 0 で 1 が何ですか。ただし、この方法の方がスケーラブルです。契約コストは比較的高いです。

FAST の主な目的は、型テンプレートに従ってオブジェクトを文字列に変換し、その文字列をバイナリ ストリームに圧縮することであり、とにかくそれが意味するところです。

パッケージ

openfast-1.1.2-bin.zip

ダウンロード アドレス: OpenFAST - SourceForge.net で /openfast4j を参照します。

解凍すると書類が付いてくるのですが、この書類がちょっと説明が難しいんです…。

openfast-1.1.2-bin\openfast-1.1.2\docs\api\index.html

maven1.1.1バージョン

<依存関係>
     < groupId > org.openfast </ groupId >
     < artifactId > openfast </ artifactId >
     < version > 1.1.1 </ version >
 </ dependency >

遊ぶ

1. プロセス

(1) テンプレート (MessageTemplate) は、実際にはいくつかのフィールドと型を定義するものですが、コード層で書きたくない場合は、設定ファイルとして記述することができます。よりわかりやすいのは xml です。ファイル。トラブルを恐れる必要はありません。json ファイルまたは yml ファイルを自分で作成することもできます。

(2) コンテキスト (Context) は、1 つのエンコーダ/デコーダで共有されません。

(3) エンコード(FastEncoder)

(4) デコード(FastDecoder)

これらをすべて収集したら、最も単純なエンコードとデコードを行うのは問題ありません。

2. 直接開始する

        //模板
        MessageTemplate template = new MessageTemplate("",
                new Field[] {
                        new Scalar("1", Type.I32, Operator.COPY, ScalarValue.UNDEFINED, false),
                        new Scalar("2", Type.I32, Operator.DELTA, ScalarValue.UNDEFINED, false),
                });

        //上下文
        Context context = new Context();
        //注册模板
        context.registerTemplate(113, template);
        //编码器
        FastEncoder encoder = new FastEncoder(context);
        Message message = new Message(template);
        message.setInteger(1, 109);
        message.setInteger(2, 29470);
        //编码
        byte[] outByte=encoder.encode(message);

        InputStream sbs = new ByteArrayInputStream(outByte);
        //解码器
        FastDecoder fastDecoder=new FastDecoder(context,sbs);
        //解码
        Message msg111=fastDecoder.readMessage();
        log.info("解码的消息1:{}",msg111.getInt(1));
        log.info("解码的消息2:{}",msg111.getInt(2));

最終的な実行結果:

解码的消息1:109
解码的消息2:58940

おすすめ

転載: blog.csdn.net/qq_33601179/article/details/122324385