C# 二进制替换第一弹 byte 数组替换
2023-09-27 14:27:04 时间
在做通讯相关的数据操作时常常须要用到 byte[] byte 数组替换操作.比方协义转换相关的
如今提供了几种替换的方法
/// <summary> /// 二进制数据 操作 /// </summary> public class HexUtility { /// <summary> /// 二进制替换,假设没有替换则返回原数组对像的复本. /// </summary> /// <param name="sourceByteArray">源数据</param> /// <param name="oldValue">须要替换的数据</param> /// <param name="newValue">将要替换成为的数据</param> public static byte[] Replace(byte[] sourceByteArray, byte[] oldValue, byte[] newValue) { //创建新数据多出1字节 int newArrayLen = (int)((newValue.Length / (double)oldValue.Length) * sourceByteArray.Length) + 1; //得到数组长度 newArrayLen = Math.Max(newArrayLen, sourceByteArray.Length); //新的最后结果数组 byte[] newByteArray = new byte[newArrayLen]; //新数组的当前索引 int curIndex = 0; //開始结束 int start = -1; int end = -1; //当前查找到的索引 int oldCurindex = 0; //替换数据替换 for (int x = 0; x < sourceByteArray.Length; x++) { //查找要替换的数据 if (sourceByteArray[x] == oldValue[oldCurindex]) { if (oldCurindex == 0) { start = x; } if (oldCurindex == oldValue.Length - 1) { end = x; oldCurindex = 0; } else { oldCurindex++; } } else { oldCurindex = 0; newByteArray[curIndex] = sourceByteArray[x]; curIndex++; } //数据查找完毕 if (start != -1 && end != -1) { //复制替换数据 Buffer.BlockCopy(newValue, 0, newByteArray, curIndex, newValue.Length); //计算新数组的偏移量 curIndex += newValue.Length; //又一次设置须要复制索引的索引 start = end = -1; } } //处理返回结果 byte[] result = null; if (curIndex != 0) { result = new byte[curIndex]; Buffer.BlockCopy(newByteArray, 0, result, 0, result.Length); } else { result = new byte[sourceByteArray.Length]; Buffer.BlockCopy(sourceByteArray, 0, result, 0, result.Length); } return result; } /// <summary> /// 二进制替换,假设没有替换则返回原数组对像的复本. /// </summary> /// <param name="sourceByteArray">源数据</param> /// <param name="replaces">须要替换的数据集合</param> public static byte[] Replace(byte[] sourceByteArray, List<HexReplaceEntity> replaces) { //创建新数据多出1字节 int newArrayLen = (int)((replaces.Sum(p => p.newValue.Length) / (double)replaces.Sum(p => p.oldValue.Length)) * sourceByteArray.Length) + 1; //得到数组长度 newArrayLen = Math.Max(newArrayLen, sourceByteArray.Length); //新的最后结果数组 byte[] newByteArray = new byte[newArrayLen]; //新数组的当前索引 int curIndex = 0; bool find = false; //替换数据替换 for (int x = 0; x < sourceByteArray.Length; x++) { foreach (HexReplaceEntity rep in replaces) { //查找要替换的数据 if (sourceByteArray[x] == rep.oldValue[rep.oldCurindex]) { if (rep.oldCurindex == 0) { rep.start = x; } if (rep.oldCurindex == rep.oldValue.Length - 1) { rep.end = x; rep.oldCurindex = 0; } else { rep.oldCurindex++; } } else { rep.oldCurindex = 0; newByteArray[curIndex] = sourceByteArray[x]; find = false; } //数据查找完毕 if (rep.start != -1 && rep.end != -1) { find = true; if (rep.newValue.Length >= rep.oldValue.Length) { //复制替换数据 Buffer.BlockCopy(rep.newValue, 0, newByteArray, curIndex, rep.newValue.Length); //计算新数组的偏移量 curIndex += rep.newValue.Length; } else //由大字节替换为少字节时出现了问题 { curIndex -= rep.end - rep.start; //复制替换数据 Buffer.BlockCopy(rep.newValue, 0, newByteArray, curIndex, rep.newValue.Length); //计算新数组的偏移量 curIndex += rep.newValue.Length; } //又一次设置须要复制索引的索引 rep.start = rep.end = -1; break; } } if (!find) { curIndex++; } } //处理返回结果 byte[] result = null; if (curIndex != 0) { result = new byte[curIndex]; Buffer.BlockCopy(newByteArray, 0, result, 0, result.Length); } else { result = new byte[sourceByteArray.Length]; Buffer.BlockCopy(sourceByteArray, 0, result, 0, result.Length); } return result; } } /// <summary> /// 替换数据实体 /// </summary> public class HexReplaceEntity { /// <summary> /// 须要替换的原始值 /// </summary> public byte[] oldValue { get; set; } /// <summary> /// 新值 /// </summary> public byte[] newValue { get; set; } /// <summary> /// 默认開始结束标记 /// </summary> internal int start = -1; /// <summary> /// 默认開始结束标记 /// </summary> internal int end = -1; //当前查找到的索引 internal int oldCurindex = 0; }
相关文章
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- C# (初入江湖)-写个小猫猜数,一起玩玩吧(数组、字符串)
- C#学习记录——在C#中操作注册表
- C#学习记录——实例练习:倒计时器
- C#【多线程篇】线程池的使用与线程终止继续
- C#,无监督的K-Medoid聚类算法(K-Medoid Algorithm)与源代码
- C#,实用新型加强版的整数数组
- C#,求最长回文字符串的马拉车(Manacher)算法的源代码
- 用最小二乘法拟合任意次函数曲线(C#)
- C# 数组及集合
- C#使用反射加载多个程序集
- c# 数组
- 你是否有遇到过某个实体类字段(属性)过多的情况,不想每次点的话戳进来(C# 反射)
- C# 匿名方法和Lambda表达式
- C# 四舍五入 保留两位小数(转载)
- C#多线程问题(从不同步的代码块中调用了对象同步方法。)
- C#基础之.NET环境下WebConfig的加密
- C#中二维数组int[,]与交叉数组int[][]的区别
- C#,单元测试入门