C#-字节byte操作-字节替换

/// <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
{
    public HexReplaceEntity()
    {
    }
    public HexReplaceEntity(byte[] oldValue, byte[] newValue)
    {
	this.oldValue = oldValue;
	this.newValue = newValue;
    }
    /// <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;

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可曾听闻丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值