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; }
C# 二进制替换第一弹 byte 数组替换的更多相关文章
- Java从内存流中读取byte数组
Java中通过servlet接收二进制数据,然后将二进制数据流读取为byte数组.开始使用:byte[] bs = new byte[request.getContentLength()];reque ...
- JS的replace默认只替换第一个匹配项
1. JS的replace默认只替换第一个匹配项. 解决方法: 使用正则表达式进行匹配替换[ ①.replace(new RegExp(②,"g") ,③); ] ①:包含 ...
- 二进制样式的字符串与byte数组互转函数示例
开发时用到的方法,记录下: /// <summary> /// 测试方法 /// </summary> private void TestFun() { Response.Wr ...
- 二进制流 最后一段数据是最后一次读取的byte数组没填满造成的
while(in.read(temp)!=-1){ out.write(temp); } 改成: int len; while((len=in.read(temp))!=-1){out.write(t ...
- .NET如何快速比较两个byte数组是否相等
目录 前言 评测方案 几种不同的方案 For循环 Memcmp 64字长优化 SIMD Sse Avx2 SequenceCompare 总结 参考文献 前言 之前在群里面有群友问过一个这样的问题,在 ...
- typecho流程原理和插件机制浅析(第一弹)
typecho流程原理和插件机制浅析(第一弹) 兜兜 393 2014年03月28日 发布 推荐 5 推荐 收藏 24 收藏,3.5k 浏览 虽然新版本0.9在多次跳票后终于发布了,在漫长的等待里始终 ...
- 我的长大app开发教程第一弹:Fragment布局
在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用. 在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准 ...
- Byte数组和字符串相互转换的问题
第一:需求:将文件转成byte数组,之后转成字符串返回.过滤器接收到响应内容后,需要将响应的内容转成byte数组. 第二:我刚开始的做法: Controller:byteArr = Conversio ...
- byte数组转float实现与byte转换其它类型时进行&运算原理
下面是将byte数组转换为float的实现 public static float getFloat(byte[] b) { int accum = 0; accum = accum|(b[0] &a ...
随机推荐
- WPF扩展标记
标记扩展和 WPF XAML,标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能 XAML 处理器和标记扩展 XAML 分析器可将特性值解释为可转换成基元的文本字符串,或可通过 ...
- Java网络编程--echo服务器
客户端使用Java的阻塞IO 服务端使用Java的非阻塞NIO package com.nio.echo; import java.io.IOException; import java.io.Inp ...
- theano中对图像进行convolution 运算
(1) 定义计算过程中需要的symbolic expression """ 定义相关的symbolic experssion """ # c ...
- UFLDL教程(四)之Softmax回归
关于Andrew Ng的machine learning课程中,有一章专门讲解逻辑回归(Logistic回归),具体课程笔记见另一篇文章. 下面,对Logistic回归做一个简单的小结: 给定一个待分 ...
- [BZOJ - 2631] tree 【LCT】
题目链接:BZOJ - 2631 题目分析 LCT,像线段树区间乘,区间加那样打标记. 这道题我调了一下午. 提交之后TLE了,我一直以为是写错了导致了死循环. 于是一直在排查错误.直到.. 直到我看 ...
- [BZOJ 3620] 似乎在梦中见过的样子 【KMP】
题目链接:BZOJ - 3620 题目分析 这道题使用 KMP 做 O(n^2) 的暴力就能过. 首先,我们依次枚举字串左端点 l ,然后从这个左端点开始向后做一次 KMP. 然后我们枚举右端点 r ...
- Keil_C51程序调试过程
调试一般都是在发生错误与意外的情况下使用的.如果程序能正常执行,调试很多时候都是用不上的.所以,最高效率的程序开发还是程序员自己做好规范,而不是指望调试来解决问题. 单片机的程序调试分为两种,一种是使 ...
- YII model模型和登陆详解
模型是 CModel 或其子类的实例.模型用于保持数据以及与其相关的业务逻辑. 模型是单独的数据对象.它可以是数据表中的一行,或者一个用户输入的表单. 数据对象的每个字段对应模型中的一个属性.每个属性 ...
- 【Better Code】面向切面编程
用AOP改善JavaScript代码http://www.w3cfuns.com/thread-5597323-1-1.html
- Am命令
Am.java中: Override public void onRun() throws Exception { mAm = ActivityManagerNative.getDefault(); ...