63 lines
1.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|