Ejemplo n.º 1
0
    public static List <SocketData> UnwrapZiped(byte[] buf, ref int beginOffset, int bufLen)
    {
        if (buf.Length == 0 || bufLen == 0)
        {
            return(null);
        }

        int oriBeginOffset = beginOffset;

        while (beginOffset < bufLen - WrapperLen && buf[beginOffset] != PackageBreaker)
        {
            ++beginOffset;
        }
        if (oriBeginOffset != beginOffset)
        {
            Debug.LogError("#Wrong Start Breaker. Offset => frome " + oriBeginOffset + " to " + beginOffset);
        }

        int absDataSizeOffset = beginOffset + DataSizeOffset;
        int dataSize          = ReadInt(buf, ref absDataSizeOffset);
        int totalLen          = beginOffset + dataSize + WrapperLen;

        if (totalLen > bufLen)         // data is not complete, wait
        {
            return(null);
        }

        if (buf[beginOffset + totalLen - 1] != PackageBreaker)
        {
            ++beginOffset;
            Debug.LogError("#Wrong End Breaker. Offset => " + beginOffset);
            return(null);
        }

        // begin unwrap
        SocketData sockData   = new SocketData();
        int        wrapOffset = beginOffset;

        // marker
        ReadByte(buf, ref wrapOffset);
        // handle id
        sockData.handleId = ReadShort(buf, ref wrapOffset);
        // version
        sockData.version = ReadByte(buf, ref wrapOffset);

        var list = new List <SocketData>();

        // data size
        ReadInt(buf, ref wrapOffset);
        // data
        sockData.data = new byte[dataSize];
        Array.Copy(buf, wrapOffset, sockData.data, 0, dataSize);
        wrapOffset += dataSize;
        // check crc
        UInt32 crc = ReadUInt32(buf, ref wrapOffset);

        if (!sockData.CheckCRC(crc))
        {
            ++beginOffset;
            Debug.LogError("#Wrong CRC. Offset => " + beginOffset);
            return(null);
        }
        // marker
        ReadByte(buf, ref wrapOffset);
        beginOffset = wrapOffset;

        if (sockData.version != 2)
        {
            list.Add(sockData);
            return(list);
        }

        var unziped = GZIPWrapper.UnzipBytesWithoutHeader(sockData.data);

        var i    = 0;
        var size = unziped.Length;

        while (i < size)
        {
            var sData = Unwrap(unziped, ref i, size);
            if (sData != null)
            {
                list.Add(sData);
            }
        }

        return(list);
    }
Ejemplo n.º 2
0
    public static SocketData Unwrap(byte[] buf, ref int beginOffset, int bufLen)
    {
        if (buf.Length == 0 || bufLen == 0)
        {
            return(null);
        }

        int oriBeginOffset = beginOffset;

        while (beginOffset < bufLen - WrapperLen && buf[beginOffset] != PackageBreaker)
        {
            ++beginOffset;
        }
        if (oriBeginOffset != beginOffset)
        {
            Debug.LogError("#Wrong Start Breaker. Offset => frome " + oriBeginOffset + " to " + beginOffset);
        }

        int absDataSizeOffset = beginOffset + DataSizeOffset;
        int dataSize          = ReadInt(buf, ref absDataSizeOffset);
        int totalLen          = beginOffset + dataSize + WrapperLen;

        if (totalLen > bufLen)         // data is not complete, wait
        {
            return(null);
        }

        if (buf[totalLen - 1] != PackageBreaker)
        {
            ++beginOffset;
            Debug.LogError("#Wrong End Breaker. Offset => " + beginOffset);
            return(null);
        }

        // begin unwrap
        SocketData sockData   = new SocketData();
        int        wrapOffset = beginOffset;

        // marker
        ReadByte(buf, ref wrapOffset);
        // handle id
        sockData.handleId = ReadShort(buf, ref wrapOffset);
        // version
        sockData.version = ReadByte(buf, ref wrapOffset);
        // data size
        ReadInt(buf, ref wrapOffset);
        // data
        sockData.data = new byte[dataSize];
        Array.Copy(buf, wrapOffset, sockData.data, 0, dataSize);
        wrapOffset += dataSize;
        // check crc
        UInt32 crc = ReadUInt32(buf, ref wrapOffset);

        if (!sockData.CheckCRC(crc))
        {
            ++beginOffset;
            Debug.LogError("#Wrong CRC. Offset => " + beginOffset);
            return(null);
        }
        // marker
        ReadByte(buf, ref wrapOffset);
        beginOffset = wrapOffset;
        return(sockData);
    }