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); }
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); }