如何简化这些方法以避免混淆?

时间:2017-11-25 19:25:33

标签: c# .net

我今天来这里询问有关这些方法的问题。作为一种爱好,我在个人项目中处于领先地位,不幸的是我无法联系旧开发人员询问这些方法甚至做了什么。我对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);
    }
}

1 个答案:

答案 0 :(得分:2)

BinaryReader包含方法ReadInt16ReadInt32(以及许多其他方法)。因此,您可以替换解码方法。

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

变为

int MsgLen = Reader.ReadInt32();

我认为Endianness字节的this适用于BinaryReader方法。