using System.Text; namespace XFEExtension.NetCore.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]; } /// /// 替换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 = []; 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]; } /// /// 分割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([0x02, 0x03], [0x02, 0x02, 0x03]).ToList()); } return [.. packedBuffer]; } /// /// 为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([0x01, 0x02, 0x03])) { unPackedBuffers.Add(unPackedBuffer.Replace([0x02, 0x02, 0x03], [0x02, 0x03])); } return unPackedBuffers; } }