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]); } } }