/// <summary> /// Adiciona o terminador do cabeçalho. /// </summary> /// <param name="header"></param> /// <param name="terminator"></param> public void AddHeaderTerminator(byte[] header, byte[] terminator) { lock (_formatLock) { foreach (HeaderTerminator terminator2 in this._headerTerminatorList) { if (Matches(header, 0, header.Length, terminator2.Header, GetHeaderLength(header), false)) { foreach (byte[] buffer in terminator2.Terminators) { if (Matches(terminator, 0, terminator.Length, buffer, GetTerminatorLength(buffer), false)) { return; } } terminator2.Terminators.Add(terminator); } } HeaderTerminator item = new HeaderTerminator { Header = header }; item.Terminators.Add(terminator); _headerTerminatorList.Add(item); } }
/// <summary> /// Limpa os buffers. /// </summary> public void CleanBuffers() { _bufferList.Clear(); _bufferIndex = 0; _bufferReadIndex = 0; _leftOverSize = 0; _headerTerminator = null; }
/// <summary> /// Lê o buffer. /// </summary> /// <param name="data"></param> /// <param name="expectedSize">Tamanho esperado.</param> /// <returns></returns> public bool ReadBuffer(out byte[] data, int expectedSize) { _headerTerminator = null; int maxDataLength = expectedSize; if (MaxDataLength < maxDataLength) { maxDataLength = MaxDataLength; } data = null; try { while (0 < _bufferList.Count) { byte[] buffer = _bufferList[0]; if (buffer != null) { while (_bufferIndex < buffer.Length) { if (maxDataLength <= _bufferReadIndex) { break; } if (_bufferRead.Length <= _bufferReadIndex) { Array.Resize <byte>(ref _bufferRead, _bufferRead.Length * 2); } _bufferRead[_bufferReadIndex] = buffer[_bufferIndex]; _bufferReadIndex++; _bufferIndex++; } if (maxDataLength <= _bufferReadIndex) { Array.Resize <byte>(ref _bufferRead, _bufferReadIndex); data = _bufferRead; _bufferRead = new byte[1024]; _bufferReadIndex = 0; _leftOverSize = expectedSize - data.Length; return(true); } } _bufferList.RemoveAt(0); _bufferIndex = 0; } } catch (ArgumentOutOfRangeException) { return(false); } return(false); }
/// <summary> /// Recupera o terminador com base nos dados informados. /// </summary> /// <param name="data"></param> /// <param name="length"></param> /// <returns></returns> private HeaderTerminator GetHeaderTerminator(byte[] data, int length) { HeaderTerminator terminator = null; lock (_formatLock) { foreach (HeaderTerminator terminator2 in this._headerTerminatorList) { byte[] header = terminator2.Header; if ((IsNone(header) || Matches(header, 0, header.Length, data, length, false)) && ((terminator == null) || (GetHeaderLength(terminator.Header) < GetHeaderLength(header)))) { terminator = terminator2; } } } return(terminator); }
/// <summary> /// Lê o buffer. /// </summary> /// <param name="data"></param> /// <returns></returns> public bool ReadBuffer(out byte[] data) { data = null; try { int startIndex = 0; while (0 < _bufferList.Count) { byte[] buffer = _bufferList[0]; if (buffer != null) { while (_bufferIndex < buffer.Length) { if (this._bufferRead.Length <= _bufferReadIndex) { Array.Resize <byte>(ref _bufferRead, _bufferRead.Length * 2); } _bufferRead[_bufferReadIndex] = buffer[_bufferIndex]; _bufferReadIndex++; _bufferIndex++; if ((_headerTerminator == null) && (_bufferReadIndex <= 5)) { _headerTerminator = GetHeaderTerminator(_bufferRead, _bufferReadIndex); if (_headerTerminator != null) { startIndex = GetHeaderLength(_headerTerminator.Header); } } bool flag = EndsWithTerminator(_bufferRead, startIndex, _bufferReadIndex, _headerTerminator); if (flag) { _headerTerminator = null; } if ((flag || (MaxDataLength <= _bufferReadIndex)) || UseFormatLength) { int num2; if (0 < _leftOverSize) { return(ReadBuffer(out data, _leftOverSize)); } if (UseFormatLength && ReadDataLength(out num2)) { return(ReadBuffer(out data, num2)); } if (!UseFormatLength && (flag || (MaxDataLength <= _bufferReadIndex))) { Array.Resize <byte>(ref _bufferRead, _bufferReadIndex); data = this._bufferRead; _bufferRead = new byte[1024]; _bufferReadIndex = 0; return(true); } } } } _bufferList.RemoveAt(0); _bufferIndex = 0; } } catch (ArgumentOutOfRangeException) { return(false); } return(false); }
/// <summary> /// Verifica se os dados informados terminam com o terminador informado. /// </summary> /// <param name="data">Buffer.</param> /// <param name="startIndex">Indice de inicio para leitura do buffer.</param> /// <param name="length">Tamanho dos dados que devem ser lidos.</param> /// <param name="headerTerminator"></param> /// <returns></returns> private static bool EndsWithTerminator(byte[] data, int startIndex, int length, HeaderTerminator headerTerminator) { if (headerTerminator != null) { foreach (byte[] buffer in headerTerminator.Terminators) { if (IsNone(buffer)) { return(false); } if (length < (startIndex + GetTerminatorLength(buffer))) { return(false); } if (Matches(buffer, 0, GetTerminatorLength(buffer), data, length, true)) { return(true); } } } return(false); }