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 ...
随机推荐
- git 创建多个账户ssh
创建一个账户 创建ssh本地秘钥. $ ssh-keygen -t rsa -C "youremail@xxx.com" 一路回车,会在~/.ssh/目录下生成id_rsa和id_ ...
- MAC 安装Ruby On Rails
MAC 安装Ruby On Rails 对于新入门的开发者,如何安装 Ruby, Ruby Gems 和 Rails 的运行环境可能会是个问题,本页主要介绍如何用一条靠谱的路子快速安装 Ruby 开发 ...
- Window7 下开发php扩展
一.首先查看phpinfo() 信息PHP Version 5.4.34Zend Extension Build API220100525,TS,VC9 PHP Extension Build ...
- winfrom获得鼠标的坐标
Point mouse = this.PointToScreen(Control.MousePosition);label1.Text = mouse.X.ToString() + ":&q ...
- ZeroBraneStudio之支持远程调试
打开ZBS后,如果需要远程调试得先开启调试服务器:Project->Start Debugger Server 打开之后就可以编辑文件进行测试了.示例代码如下: local ZBS = 'D:/ ...
- BZOJ 2242 计算器
Description 你被要求设计一个计算器完成以下三项任务: \(1.\)给定\(y,z,p\),计算\(y^{z}\;mod\;P\)的值: \(2.\)给定\(y,z,p\),计算满足\(xy ...
- iOS开发(Objective-C)常用库索引
code4app.com 这网站不错,收集各种 iOS App 开发可以用到的代码示例 cocoacontrols.com/ 英文版本的lib收集 objclibs.com/ 精品lib的收集网站 h ...
- PHP 7 探针的安装与测试
首先,这是一篇软文,没错!就是一篇软文.因为我知道「PHP 是世界上最好的语言」,所以我相信很多人愿意读这篇用户帮忙写的软文,因为这篇软文应该能帮助 PHP 开发的同学一点小忙.我们是一家成立了7年的 ...
- Apache log4net™ Config Examples
Overview This document presents example configurations for the built-in appenders. These configurati ...
- Solr4.4的安装与配置
最近准备用Solr搭建项目,所以对其作了一些了解,我采用的是Solr4.4版本:这个版本的Solr相对于以前的版本改变很大,这里记一下自己安装与配置的过程. 网上很多关于Solr的教程都很老了,很多教 ...