Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/MECF/Framework/Common/Communications/Tcp/Socket/Framing/LineBasedFrameDecoder.cs

63 lines
1.4 KiB
C#

using System;
using MECF.Framework.Common.Communications.Tcp.Socket.Framing.Base;
namespace MECF.Framework.Common.Communications.Tcp.Socket.Framing
{
public sealed class LineBasedFrameDecoder : IFrameDecoder
{
private readonly LineDelimiter _delimiter;
public LineDelimiter LineDelimiter => _delimiter;
public LineBasedFrameDecoder()
: this(LineDelimiter.CRLF)
{
}
public LineBasedFrameDecoder(LineDelimiter delimiter)
{
if (delimiter == null)
{
throw new ArgumentNullException("delimiter");
}
_delimiter = delimiter;
}
public bool TryDecodeFrame(byte[] buffer, int offset, int count, out int frameLength, out byte[] payload, out int payloadOffset, out int payloadCount)
{
frameLength = 0;
payload = null;
payloadOffset = 0;
payloadCount = 0;
if (count < _delimiter.DelimiterBytes.Length)
{
return false;
}
byte[] delimiterBytes = _delimiter.DelimiterBytes;
bool flag = false;
for (int i = 0; i < count; i++)
{
for (int j = 0; j < delimiterBytes.Length; j++)
{
if (i + j < count && buffer[offset + i + j] == delimiterBytes[j])
{
flag = true;
continue;
}
flag = false;
break;
}
if (flag)
{
frameLength = i + delimiterBytes.Length;
payload = buffer;
payloadOffset = offset;
payloadCount = i;
return true;
}
}
return false;
}
}
}