using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace XFEExtension.BufferExtension
{
///
/// 对二进制数组的拓展
///
public static class BufferExtension
{
///
/// 获取第一个匹配Buffer的位置
///
///
/// 要匹配Buffer
/// 没有查找到为-1
public static int IndexOf(this byte[] buffer, byte[] targetBuffer)
{
int index = -1;
for (int i = 0; i < buffer.Length; i++)
{
if (buffer[i] == targetBuffer[0])
{
bool isMatch = true;
for (int j = 0; j < targetBuffer.Length; j++)
{
if (buffer[i + j] != targetBuffer[j])
{
isMatch = false;
break;
}
}
if (isMatch)
{
index = i;
break;
}
}
}
return index;
}
///
/// 获取所有匹配的Buffer的位置
///
///
/// 要匹配的Buffer
/// 是否可以共用
/// 查找到的位置数组
public static int[] IndexesOf(this byte[] buffer, byte[] targetBuffer, bool shareable = false)
{
var indexes = new List();
for (int i = 0; i < buffer.Length; i++)
{
if (buffer[i] == targetBuffer[0])
{
bool isMatch = true;
for (int j = 0; j < targetBuffer.Length; j++)
{
if (buffer[i + j] != targetBuffer[j])
{
isMatch = false;
break;
}
}
if (isMatch)
{
indexes.Add(i);
if (!shareable)
i += targetBuffer.Length - 1;
}
}
}
return indexes.ToArray();
}
///
/// 替换Buffer中的指定Buffer为目标Buffer
///
///
///
///
/// 替换后的Buffer
public static byte[] Replace(this byte[] buffer, 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)
{
throw new ArgumentException("Input buffer cannot be null or empty.");
}
List result = new List();
for (long i = 0; i <= buffer.LongLength - originBuffer.LongLength; i++)
{
bool isMatch = true;
for (long j = 0; j < originBuffer.LongLength; j++)
{
if (buffer[i + j] != originBuffer[j])
{
isMatch = false;
break;
}
}
if (isMatch)
{
result.AddRange(targetBuffer);
i += originBuffer.LongLength - 1;
}
else
{
result.Add(buffer[i]);
}
}
for (long i = buffer.LongLength - originBuffer.LongLength + 1; i < buffer.LongLength; i++)
{
result.Add(buffer[i]);
}
return result.ToArray();
}
///
/// 分割Buffer
///
///
/// 分割器
///
public static List Split(this byte[] buffer, 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 (long j = index; j < indexes[i]; j++)
{
newBuffer[j - index] = buffer[j];
}
buffers.Add(newBuffer);
index = indexes[i] + targetBuffer.LongLength;
}
var lastBuffer = new byte[buffer.LongLength - index];
for (long 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 (int i = 0; i < buffers.Count; i++)
{
if (i != 0)
packedBuffer.AddRange(new List { 0x01, 0x02, 0x03 });
packedBuffer.AddRange(buffers[i].Replace(new byte[] { 0x02, 0x03 }, new byte[] { 0x02, 0x02, 0x03 }).ToList());
}
return packedBuffer.ToArray();
}
///
/// 为Buffer添加头部并封装为XFEBuffer
///
///
///
///
public static byte[] AddHeaderAndPack(this byte[] buffer, params string[] headers)
{
var buffers = new List();
foreach (var header in headers)
{
buffers.Add(Encoding.UTF8.GetBytes(header));
}
buffers.Add(buffer);
return buffers.PackBuffer();
}
///
/// 为Buffer添加头部并封装为XFEBuffer
///
///
///
///
public static byte[] AddHeaderAndPack(this byte[] buffer, params byte[] headers)
{
return new List() { headers, buffer }.PackBuffer();
}
///
/// 将XEFBuffer转换为BufferList
///
///
///
public static List UnPackBuffer(this byte[] buffer)
{
var unPackedBuffers = new List();
foreach (var unPackedBuffer in buffer.Split(new byte[] { 0x01, 0x02, 0x03 }))
{
unPackedBuffers.Add(unPackedBuffer.Replace(new byte[] { 0x02, 0x02, 0x03 }, new byte[] { 0x02, 0x03 }));
}
return unPackedBuffers;
}
}
///
/// XFE的二进制数组协议
///
public class XFEBuffer
{
private Dictionary bufferDictionary = new Dictionary();
private List headerBuffers = new List();
///
/// 所有的头
///
public Dictionary.KeyCollection Headers
{
get
{
return bufferDictionary.Keys;
}
}
///
/// 所有的值
///
public Dictionary.ValueCollection Buffers
{
get
{
return bufferDictionary.Values;
}
}
///
/// 长度
///
public int Count
{
get
{
return bufferDictionary.Count;
}
}
///
/// 获取或设置Buffer
///
///
///
public byte[] this[string header]
{
get
{
return bufferDictionary[header];
}
set
{
bufferDictionary[header] = value;
}
}
///
/// 封装Buffer
///
///
public byte[] ToBuffer()
{
return headerBuffers.PackBuffer();
}
///
/// 将Buffer转换为XFEBuffer
///
///
///
public static XFEBuffer ToXFEBuffer(byte[] buffer)
{
var xFEBuffer = new XFEBuffer();
var buffers = buffer.UnPackBuffer();
for (int i = 0; i < buffers.Count; i++)
{
if (i % 2 == 0)
{
xFEBuffer.bufferDictionary.Add(Encoding.UTF8.GetString(buffers[i]), buffers[i + 1]);
xFEBuffer.headerBuffers.Add(buffers[i]);
xFEBuffer.headerBuffers.Add(buffers[i + 1]);
}
}
return xFEBuffer;
}
///
/// 添加XFEBuffer
///
/// 头
/// Buffer
public void Add(string header, byte[] buffer)
{
bufferDictionary.Add(header, buffer);
headerBuffers.Add(Encoding.UTF8.GetBytes(header));
headerBuffers.Add(buffer);
}
///
/// 添加XFEBuffer
///
///
///
public void AddRange(params object[] @params)
{
if (@params.Length % 2 != 0)
throw new XFEExtensionException("头和Buffer必须成对输入");
for (int i = 0; i < @params.Length; i += 2)
{
bufferDictionary.Add(@params[i].ToString(), (byte[])@params[i + 1]);
headerBuffers.Add(Encoding.UTF8.GetBytes(@params[i].ToString()));
headerBuffers.Add((byte[])@params[i + 1]);
}
}
///
/// 移除XFEBuffer
///
/// 头
public void Remove(string header)
{
bufferDictionary.Remove(header);
headerBuffers.Remove(Encoding.UTF8.GetBytes(header));
}
///
/// 移除指定位置的XFEBuffer
///
///
public void RemoveAt(int index)
{
var header = bufferDictionary.Keys.ToArray()[index];
bufferDictionary.Remove(header);
headerBuffers.Remove(Encoding.UTF8.GetBytes(header));
}
///
/// 清空
///
public void Clear()
{
bufferDictionary.Clear();
headerBuffers.Clear();
}
///
/// 是否包含
///
/// 头
///
public bool Contains(string header)
{
return bufferDictionary.ContainsKey(header);
}
///
/// 获取头
///
///
public string[] GetHeaders()
{
return bufferDictionary.Keys.ToArray();
}
///
/// XFE的二进制数组协议
///
public XFEBuffer()
{
bufferDictionary = new Dictionary();
}
///
/// XFE的二进制数组协议
///
/// 头和Buffer对
///
public XFEBuffer(params object[] @params)
{
if (@params.Length % 2 != 0)
throw new XFEExtensionException("头和Buffer必须成对输入");
for (int i = 0; i < @params.Length; i += 2)
{
bufferDictionary.Add(@params[i].ToString(), (byte[])@params[i + 1]);
headerBuffers.Add(Encoding.UTF8.GetBytes(@params[i].ToString()));
headerBuffers.Add((byte[])@params[i + 1]);
}
}
}
}