2017-11-25 5 views
-2

私はここに来て、これらの方法について質問しました。私は趣味として個人的なプロジェクトをリードしてしまいました。残念ながら、古い開発者に連絡して、これらのメソッドが何をするのか尋ねることはできません。私はC#の新機能ですから、誰かが簡単に私を助けて、私が持っている混乱を避けることができるかどうか尋ねていました。誰かが実際に私に何をしているか教えてもらえれば、それは本当に助けになるだろう混乱を避けるためにこれらの方法を簡略化するには?

私は今のところ彼らについてちょっと混乱しています...彼らはユーティリティフォルダにあります。このプロジェクトは、ゲームのエミュレーションサーバーであり、パケットの送受信が主な焦点です。

public static int DecodeInt32(byte[] v) 
{ 
    if ((v[0] | v[1] | v[2] | v[3]) < 0) 
    { 
     return -1; 
    } 
    return (v[0] << 0x18) + (v[1] << 0x10) + (v[2] << 8) + v[3]; 
} 

public static int DecodeInt16(byte[] v) 
{ 
    if ((v[0] | v[1]) < 0) 
    { 
     return -1; 
    } 
    return (v[0] << 8) + v[1]; 
} 

ここでは、それらを使用するコードの一部がわかります。

using (BinaryReader Reader = new BinaryReader(new MemoryStream(Data))) 
{ 
    if (Data.Length < 4) 
     return; 

    int MsgLen = Utilities.DecodeInt32(Reader.ReadBytes(4)); 

    if ((Reader.BaseStream.Length - 4) < MsgLen) 
    { 
     this._halfData = Data; 
     this._halfDataRecieved = true; 
     return; 
    } 
    else if (MsgLen < 0 || MsgLen > 5120)//TODO: Const somewhere. 
     return; 

    byte[] Packet = Reader.ReadBytes(MsgLen); 

    using (BinaryReader R = new BinaryReader(new MemoryStream(Packet))) 
    { 
     int Header = Utilities.DecodeInt16(R.ReadBytes(2)); 

     byte[] Content = new byte[Packet.Length - 2]; 
     Buffer.BlockCopy(Packet, 2, Content, 0, Packet.Length - 2); 

     ClientPacket Message = new ClientPacket(Header, Content); 

     try 
     { 
      Server.GetGame().GetPacketManager().TryExecutePacket(this, Message); 
     } 
     catch (Exception e) 
     { 
      ExceptionLogger.LogException(e); 
     } 

     this._deciphered = false; 
    } 

    if (Reader.BaseStream.Length - 4 > MsgLen) 
    { 
     byte[] Extra = new byte[Reader.BaseStream.Length - Reader.BaseStream.Position]; 
     Buffer.BlockCopy(Data, (int)Reader.BaseStream.Position, Extra, 0, (int)(Reader.BaseStream.Length - Reader.BaseStream.Position)); 

     this._deciphered = true; 
     HandleMoreData(Extra); 
    } 
} 
+0

'DecodeInt32'は、基本的にバイト配列を32ビット整数に変換します。 –

+0

データの最初の4バイトから何個のデータが到着しているかを計算し、まだ十分なデータが受信されていない場合は内部的に格納します(ハーフデータ部分)。おそらく後でそのデータを受け取ったときに使用されるでしょう。デコードの '' << '部分は、バイトの単純なビットシフト(それぞれ8ビット)で、16ビットまたは32ビットの整数を計算します。あなたのコードの下の部分。あなたのゲームPacketmanagerとパケットに関するドキュメンテーションとその使い方を調べてください。 –

+1

私が知る限り、 '(v [0] | v [1] | v [2] | v [3])'はゼロより小さくはできません。 –

答えて

2

BinaryReader方法ReadInt16ReadInt32(および他の多く)を有しています。したがって、デコード方法を置き換えることができます。

int MsgLen = Utilities.DecodeInt32(Reader.ReadBytes(4)); 

私はバイトのEndiannessBinaryReader方法のために右であることを前提としてい

int MsgLen = Reader.ReadInt32(); 

になります。

+0

@mihi私には恥ずべき!ありがとう、仲間:) – pkuderov

+0

ReadInt32は反対の順序でバイトを読み取ります。https://referencesource.microsoft.com/#mscorlib/system/io/binaryreader.cs,95b16031011c2e9f – Slai

+0

ありがとうございます.ReadInt32()はありません私はそれを読んでいる4を考慮していることを考慮する?逆の順序でもあります。 – s968534

関連する問題