using System.Text; namespace XFEExtension.NetCore.BufferExtension; /// /// 对二进制数组的拓展 /// public static class BufferExtension { /// extension(byte[]? buffer) { /// /// 获取第一个匹配Buffer的位置 /// /// 要匹配Buffer /// 没有查找到为-1 public int IndexOf(byte[] targetBuffer) { var index = -1; if (buffer is null) return index; for (var i = 0; i < buffer.Length; i++) { if (buffer[i] != targetBuffer[0]) continue; var isMatch = true; for (var j = targetBuffer.Length - 1; j >= 0; j--) { if (buffer[i + j] == targetBuffer[j]) continue; isMatch = false; break; } if (!isMatch) continue; index = i; break; } return index; } /// /// 获取所有匹配的Buffer的位置 /// /// 要匹配的Buffer /// 是否可以共用 /// 查找到的位置数组 public int[] IndexesOf(byte[] targetBuffer, bool shareable = false) { var indexes = new List(); if (buffer == null) return [.. indexes]; for (var i = 0; i < buffer.Length; i++) { if (buffer[i] != targetBuffer[0]) continue; var isMatch = !targetBuffer.Where((t, j) => buffer[i + j] != t).Any(); if (!isMatch) continue; indexes.Add(i); if (!shareable) i += targetBuffer.Length - 1; } return [.. indexes]; } /// /// 替换Buffer中的指定Buffer为目标Buffer /// /// /// /// 替换后的Buffer public byte[] Replace(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) return []; List result = []; for (long i = 0; i <= buffer.LongLength - originBuffer.LongLength; i++) { var isMatch = true; for (long j = 0; j < originBuffer.LongLength; j++) { if (buffer[i + j] == originBuffer[j]) continue; isMatch = false; break; } if (isMatch) { result.AddRange(targetBuffer); i += originBuffer.LongLength - 1; } else { result.Add(buffer[i]); } } for (var i = buffer.LongLength - originBuffer.LongLength + 1; i < buffer.LongLength; i++) { if (i >= 0) result.Add(buffer[i]); } return [.. result]; } /// /// 分割Buffer /// /// 分割器 /// public List Split(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 (var j = index; j < indexes[i]; j++) if (buffer is not null) newBuffer[j - index] = buffer[j]; buffers.Add(newBuffer); index = indexes[i] + targetBuffer.LongLength; } if (buffer is null) return buffers; var lastBuffer = new byte[buffer.LongLength - index]; for (var 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 (var 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]; } /// extension(byte[] buffer) { /// /// 为Buffer添加头部并封装为XFEBuffer /// /// /// public byte[] AddHeaderAndPack(params string[] headers) { var buffers = headers.Select(header => Encoding.UTF8.GetBytes(header)).ToList(); buffers.Add(buffer); return buffers.PackBuffer(); } /// /// 为Buffer添加头部并封装为XFEBuffer /// /// /// public byte[] AddHeaderAndPack(params byte[] headers) => new List { headers, buffer }.PackBuffer(); /// /// 将XEFBuffer转换为BufferList /// /// public List UnPackBuffer() => buffer.Split([0x01, 0x02, 0x03]).Select(unPackedBuffer => unPackedBuffer.Replace([0x02, 0x02, 0x03], [0x02, 0x03])).ToList(); } }