2017-07-18 6 views
-1

問題: パケットフォーマットの固定定義を持つ電子デバイスからネットワーク入力リーダーを実装する必要があります。ヘッダー、フッター、データ本体があります。パケット内のフィールドはビット単位で定義されます。ビットサイズの定義によるJavaカスタムシリアル化と逆シリアル化

例: フィールドSEQUENCE_NUMBER変数が31に8番ビットであると私は[]の読み取りに、バイトからJavaオブジェクトに変換することができるようにack_statusは、私は、カスタムのシリアライズ関数を作成するにはどうすればよいビット32です。パケットから? 32ビットのパケットで

StartOfPacketHeaderの4ビット

CommandCodeの4ビット

SequenceNumberはの23bits

AckStatusの1ビット、私はこのオブジェクトのためのJavaラッパークラスを作るにはどうすればよい

byte []コンストラクタとtoBytes()メソッドを使用します。

シリアル化可能インターフェイスを使用すると、個々のデータサイズを制御することができません。データサイズは、3ビットまたは18ビットの変数のような奇数値であってもよい。変数の長さをビット単位で指定することはできません。

ソースは、実際にはJavaのint型はその範囲全体を扱うことができないという意味、符号なし整数を送信します。私がこれまで行ってきた何

。すべてのデータ型をすべてのケースを処理するために長く定義する必要があります。私はBitSetクラスを使ってLong変換をLong変換にしましたが、ビットセットがデフォルトでLittle Endianにビット順序を逆転させるので、あまりにも面倒で混乱します。

概要:私は、私が最も効率的な方法で各フィールドのカスタム定義を持つネットワークおよびその逆から読んバイト[]からの私のオブジェクトに変換するにはどうすればよい

答えて

0

これにはDataInputStreamDataOutputStreamを使用し、それぞれ効率のためにBufferedInputStreamまたはBufferedOutputStreamを使用します。ビットフィールドは自分でプログラムする必要がありますが、これらのクラスはすべてのJavaプリミティブをネットワークバイトオーダーで提供します。

あなたが投稿パケットについて、あなたはこのようなものが必要です。

class Packet 
{ 
    private byte header; 
    private byte commandCode; 
    private int  sequenceNumber; 
    private boolean ackStatus; 

    void write(DataOutput out) throws IOException 
    { 
     int wirePacket = header|(commandCode << 4)|(sequenceNumber << 8); 
     if (ackStatus) 
     { 
      wirePacket |= 0x80000000; 
     } 
     out.writeInt(wirePacket); 
    } 

    static Packet read(DataInput in) throws IOException 
    { 
     Packet packet = new Packet(); 
     int wirePacket = in.readInt(); 
     packet.header = (byte)(wirePacket & 0x0f); 
     packet.commandCode = (byte)((wirePacket >>> 4) & 0x0f); 
     packet.sequenceNumber = (wirePacket >>> 8) & 0x7FFFFF; 
     packet.ackStatus = (wirePacket & 0x80000000) != 0; 
     return packet; 
    } 
    // getters and setters. The setters must ensure that the values don't go out of range. 
} 
+0

を、あなたは例を引用もらえますか? –

+0

なぜですか?あなたはJavadocを読むことができませんか? – EJP

+0

私は論理が必要ですか?私はすでにそれらを使用する方法を知っています –

関連する問題