using System.Text;
namespace XFEExtension.NetCore.BufferExtension;
///
/// 对二进制数组的拓展
///
public static class BufferExtension
{
///
extension(byte[]? buffer)
{
///
/// 获取第一个匹配Buffer的位置
///
/// 要匹配Buffer
/// 没有查找到为-1
public int IndexOf(byte[] targetBuffer)
{
var index = -1;
if (buffer is null)
return index;
for (var i = 0; i < buffer.Length; i++)
{
if (buffer[i] != targetBuffer[0])
continue;
var isMatch = true;
for (var j = targetBuffer.Length - 1; j >= 0; j--)
{
if (buffer[i + j] == targetBuffer[j])
continue;
isMatch = false;
break;
}
if (!isMatch)
continue;
index = i;
break;
}
return index;
}
///
/// 获取所有匹配的Buffer的位置
///
/// 要匹配的Buffer
/// 是否可以共用
/// 查找到的位置数组
public int[] IndexesOf(byte[] targetBuffer, bool shareable = false)
{
var indexes = new List();
if (buffer == null)
return [.. indexes];
for (var i = 0; i < buffer.Length; i++)
{
if (buffer[i] != targetBuffer[0])
continue;
var isMatch = !targetBuffer.Where((t, j) => buffer[i + j] != t).Any();
if (!isMatch) continue;
indexes.Add(i);
if (!shareable)
i += targetBuffer.Length - 1;
}
return [.. indexes];
}
///
/// 替换Buffer中的指定Buffer为目标Buffer
///
///
///
/// 替换后的Buffer
public byte[] Replace(byte[] originBuffer, byte[] targetBuffer)
{
if (originBuffer is null || originBuffer.LongLength == 0)
throw new ArgumentException("Origin buffer cannot be null or empty.");
if (buffer is null || buffer.LongLength == 0)
return [];
List result = [];
for (long i = 0; i <= buffer.LongLength - originBuffer.LongLength; i++)
{
var isMatch = true;
for (long j = 0; j < originBuffer.LongLength; j++)
{
if (buffer[i + j] == originBuffer[j])
continue;
isMatch = false;
break;
}
if (isMatch)
{
result.AddRange(targetBuffer);
i += originBuffer.LongLength - 1;
}
else
{
result.Add(buffer[i]);
}
}
for (var i = buffer.LongLength - originBuffer.LongLength + 1; i < buffer.LongLength; i++)
{
if (i >= 0)
result.Add(buffer[i]);
}
return [.. result];
}
///
/// 分割Buffer
///
/// 分割器
///
public List Split(byte[] targetBuffer)
{
var indexes = buffer.IndexesOf(targetBuffer);
var buffers = new List();
long index = 0;
for (long i = 0; i < indexes.LongLength; i++)
{
var newBuffer = new byte[indexes[i] - index];
for (var j = index; j < indexes[i]; j++)
if (buffer is not null)
newBuffer[j - index] = buffer[j];
buffers.Add(newBuffer);
index = indexes[i] + targetBuffer.LongLength;
}
if (buffer is null)
return buffers;
var lastBuffer = new byte[buffer.LongLength - index];
for (var i = index; i < buffer.LongLength; i++)
lastBuffer[i - index] = buffer[i];
buffers.Add(lastBuffer);
return buffers;
}
}
///
/// 将Buffer转换为XFEBuffer
///
///
///
public static byte[] PackBuffer(this List buffers)
{
var packedBuffer = new List();
for (var i = 0; i < buffers.Count; i++)
{
if (i != 0)
packedBuffer.AddRange(new List { 0x01, 0x02, 0x03 });
packedBuffer.AddRange(buffers[i].Replace([0x02, 0x03], [0x02, 0x02, 0x03]).ToList());
}
return [.. packedBuffer];
}
///
extension(byte[] buffer)
{
///
/// 为Buffer添加头部并封装为XFEBuffer
///
///
///
public byte[] AddHeaderAndPack(params string[] headers)
{
var buffers = headers.Select(header => Encoding.UTF8.GetBytes(header)).ToList();
buffers.Add(buffer);
return buffers.PackBuffer();
}
///
/// 为Buffer添加头部并封装为XFEBuffer
///
///
///
public byte[] AddHeaderAndPack(params byte[] headers) => new List { headers, buffer }.PackBuffer();
///
/// 将XEFBuffer转换为BufferList
///
///
public List UnPackBuffer() => buffer.Split([0x01, 0x02, 0x03]).Select(unPackedBuffer => unPackedBuffer.Replace([0x02, 0x02, 0x03], [0x02, 0x03])).ToList();
}
}