using System.Text;
namespace XFEExtension.NetCore.BufferExtension;
///
/// XFE的二进制数组协议
///
public class XFEBuffer
{
private readonly Dictionary bufferDictionary = [];
private readonly List headerBuffers = [];
///
/// 所有的头
///
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];
}
///
/// XFE的二进制数组协议
///
public XFEBuffer()
{
bufferDictionary = [];
}
///
/// 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]);
}
}
}