• C# 二进制替换第一弹 byte 数组替换


    在做通讯相关的数据操作时常常须要用到 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;
    
        }


  • 相关阅读:
    图片原理解说(综合版:JPEG,PNG,BMP,GIF)
    PHP ImageMagick
    [android] 练习使用ListView(三)
    [android] 练习使用ListView(二)
    [android] 练习使用ListView(一)
    [android] 练习viewpagerindicator的使用(二)
    [android] 练习viewpagerindicator的使用(一)
    [android] 练习PopupWindow实现对话框
    [android] 练习样式主题自定义activity切换动画
    [android] 安卓自定义样式和主题
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4029099.html
Copyright © 2020-2023  润新知