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