精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 资源出售

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

2019年好项目,每月多挣好多钱收抖音火山王者引流:1513888885长期 包养全网交友粉大户┏ E3 E5 X58超强双路服务器 ┓找软件作者合作/收购引流软件出售长短效HTTP-S5私密IP-高质量
2019年好项目,每月多挣好多钱收抖音火山王者引流:1513888885长期 包养全网交友粉大户┃单进程单IP每个模拟器IP不同┃找软件作者合作/收购引流软件出售长短效HTTP-S5私密IP-高质量
全国PPTP秒换IP 动态IP仅35元/月诺宾混拨动态vps/PPTP多地区换IP长期 包养全网交友粉大户┗ 模拟器24开,稳 定 不 卡 。┛找软件作者合作/收购引流软件长期出QQ群QQ号微信精准粉网挣粉
出兼职,网赚,交友粉,扫码进群出微信qq交友粉网赚粉精准粉兼职长期 包养全网交友粉大户█IP精灵█最强大的动态IP加速器找软件作者合作/收购引流软件出网赚粉/精准粉/独家引流软件
大量收微信扫码进群男粉2820301656出Q群粉联系QQ:492544249各种【活粉变现点这里】客服①███出售质量精准粉███找软件作者合作/收购引流软件█实力公司收网赚兼职粉█
┏集团收购:一手短信、邮箱群fa┓╔ 大量现金实力收真实粉 ╗各种【活粉变现点这里】客服①高价收购网赚精准粉找软件作者合作/收购引流软件寻求实力团队
┃集团收购:一手短信、邮箱群fa┃ 日消耗X6一辆,无限收粉各种【活粉变现点这里】客服②高价收购网赚精准粉找软件作者合作/收购引流软件高效率合作,
┃集团收购:,一手精准群发用户┃ 收粉丶卖粉丶大型①群各种【活粉变现点这里】客服②高价收购网赚精准粉找软件作者合作/收购引流软件欢迎来扰!!
┃集团收购:,一手精准群发用户┃收粉丶卖粉丶大型①群各种【活粉变现点这里】客服③高价收购网赚精准粉实力团队大量收粉入群找管理无限收任何量
┗集团收购:-爬取QQ达人会员号┛收粉丶卖粉丶大型①群各种【活粉变现点这里】客服③高价收购网赚精准粉实力团队大量收粉入群找管理无限收任何量
长期大量收一手精准网赚粉收粉丶卖粉丶大型①群██大量收婚恋宝妈 快手 火山██出高质量粉,日产多、实力来谈实力团队大量收粉入群找管理无限收任何量
长期收各种精准网赚资源收粉丶卖粉丶大型①群██ 稳定收交友粉,找我换钱 ██精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理无限收任何量
长期收各种小视频网赚资源收粉丶卖粉丶大型①群██收婚恋粉宝妈粉,找我换钱██精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理无限收任何量
长期收各种引流精准网赚粉收粉丶卖粉丶大型①群██收快手火山虎牙,找我换钱██精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理拒绝骗子
大量收粉真实粉商长期合作收粉丶卖粉丶大型①群██长期大量收粉量大量小都吃██精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理拒绝骗子
加华缘社群支持免费担保收粉丶卖粉丶大型①群██ 婚恋/抖音/宝妈/空间/快手██精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理无限收任何量
欢迎粉商渠道客户进QQ群收粉丶卖粉丶大型①群███有量有质量,找我换钱███精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理无限收任何量
长期收各种粉真实长期合作收粉丶卖粉丶大型①群███实力大型公司收媒体量███精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理无限收任何量
真实网赚量点击进华缘社群收粉丶卖粉丶大型①群███大量资金,来一手代理███精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理无限收任何量
华缘社Q群号码364884407╚ 全网实力最高单价收粉 ╝ ███有量就有钱,速度来撩███精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理无限收任何量
公司实力收引流软件渠道█长期大量收购各种活粉█┃  全网大量收  ┃精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理收男粉微信扫码进群QQ1324888881
公司实力收引流软件渠道█ 长期收购各种引流软件 █┃ 各种App交友粉 ┃精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理收男粉微信扫码进群QQ1324888881
公司实力收引流软件渠道大量收代加QQ各种单双向群┃   网赚粉   ┃精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理大量收男粉扫码进群QQ1324888881
公司实力收引流软件渠道现加/拉群/现货单双向群通吃┃   游戏粉   ┃精准粉-产量高-时速快-质量好实力团队大量收粉入群找管理收男粉微信扫码进群QQ1324888881
公司实力收引流软件渠道怕你没量,别怕我没钱┃   婚恋粉   ┃出高质量粉,日产多、实力来谈实力团队大量收粉入群找管理收男粉微信扫码进群QQ1324888881
公司实力收引流软件渠道★★★★短★信★群★Fa★★★★┃  各种活人粉  ┃『实力收扫码进群量』实力团队大量收粉入群找管理无限收QQ网吧关注公众号QQ222561
公司实力收引流软件渠道短★-招中介-找中介-寻中介-★短┃   短视频粉  ┃『你量真,我需求大』实力团队大量收粉入群找管理无限收精准网赚粉联系QQ267804
公司实力收引流软件渠道信★兼职-网赚-量足大量接单★信┃ 全网最高单价收购 ┃『 你不乱,我不断 』实力团队大量收粉入群找管理长期收网赚粉 QQ8904040
公司实力收引流软件渠道群★移动-电信爆卡100%到达★群寻求 媒体量合作 有资源的撩我
『 →qq:12587210←』
寻引流高手合作/1万粉以下勿扰实力团队收粉 QQ8904040
公司实力收引流软件渠道Fa★实力机房价高质高不扣量★Fa寻求 媒体量合作 有资源的撩我
『欢迎实力粉商来撩』
寻引流高手合作/1万粉以下勿扰长期收网赚粉 QQ8904040
公司实力收引流软件渠道收网赚粉 兼职粉 宝妈粉 9703796寻求 媒体量合作 有资源的撩我———群fa资源/邮件群fa代发寻引流高手合作/1万粉以下勿扰实力团队收网赚粉入群找管理
公司实力收引流软件渠道收网赚粉 兼职粉 宝妈粉 9703796寻求 媒体量合作 有资源的撩我改成长期收购微信男活跃粉寻引流高手合作/1万粉以下勿扰实力团队收网赚粉入群找管理
公司实力收引流软件渠道收网赚粉 兼职粉 宝妈粉 9703796寻求 媒体量合作 有资源的撩我出QQ群微信QQ号交友粉网赚粉兼职粉寻引流高手合作/1万粉以下勿扰收Q粉微信扫码进群qq:2591360085
公司实力收引流软件渠道出精准网赚粉 兼职粉寻求 媒体量合作 有资源的撩我实力团队收粉,收购引流软件寻引流高手合作/1万粉以下勿扰█拨号VPS服务器4元/天免费测试█
公司实力收引流软件渠道█微信朋友圈投放网赚广告█寻求 媒体量合作 有资源的撩我短信实力卡发量,无视内容寻引流高手合作/1万粉以下勿扰每天稳定出正常话术邮箱交友粉
出售精准网赚粉、兼职粉集团超高价收量QQ: 2019306666寻求 媒体量合作 有资源的撩我群fa短信 95达到率寻引流高手合作/1万粉以下勿扰我要租广告位
查看: 3135|回复: 2
收起左侧

[C#源码] E语言的字节集相关函数的实现类

[复制链接]
发表于 2018-7-23 08:48:09 | 显示全部楼层 |阅读模式

我们知道易语言字节集就是处理byte[]。
虽然处理byte[] C#有丰富的方法。
但实现易语言字节集处理这个类还是有丰富的意义:
。仿写易语言功能时用
。http相关操作时用,比如图片上传等要处理byte[]时
。socket处理协yi时也是处理字节集,即byte[]

注意函数的命名跟易语言对应的指令是一致的。

  1. /// <summary>
  2.     /// byte[]处理类,即e语言:字节集处理
  3.     /// </summary>
  4.     public static class binHelper
  5.     {
  6.         /// <summary>
  7.         /// E语言功能:取重复字节集
  8.         /// </summary>
  9.         /// <param name="repNums"></param>
  10.         /// <param name="repByteAry"></param>
  11.         /// <returns></returns>
  12.         public static byte[] bin(int repNums,byte[] repByteAry)
  13.         {
  14.             var tmp = new List<byte>();
  15.             for(int i=0;i<repNums;i++)
  16.             {
  17.                 tmp.AddRange(repByteAry);
  18.             }
  19.             return tmp.ToArray();
  20.         }

  21.         /// <summary>
  22.         /// E语言功能:取空白字节集
  23.         /// </summary>
  24.         /// <param name="len">零字节数目</param>
  25.         /// <returns></returns>
  26.         public static byte[] SpaceBin(int len)
  27.         {
  28.             var tmp = new List<byte>();
  29.             for (int i = 0; i < len; i++)
  30.                 tmp.Add(0);
  31.             return tmp.ToArray();
  32.         }


  33.         /// <summary>
  34.         /// E语言功能:字节集替换
  35.         /// </summary>
  36.         /// <param name="data"></param>
  37.         /// <param name="searchString">搜索的字符串</param>
  38.         /// <param name="reString">要替换的字符串</param>
  39.         /// <returns></returns>
  40.         public static byte[] RpBin(this byte[] data,string searchString,string reString)
  41.         {
  42.             return data.Replace1(Encoding.Default.GetBytes(searchString),
  43.                 Encoding.Default.GetBytes(reString));
  44.         }

  45.         /// <summary>
  46.         /// E语言功能:字节集替换
  47.         /// </summary>
  48.         /// <param name="data">数据</param>
  49.         /// <param name="searchByteAry">搜索字节集</param>
  50.         /// <param name="repByteAry">要替换的字节集</param>
  51.         /// <returns></returns>
  52.         public static byte[] RpBin(this byte[] data,byte[] searchByteAry,byte[] repByteAry)
  53.         {
  54.             return data.Replace1(searchByteAry, repByteAry);
  55.         }

  56.         /// <summary>
  57.         /// E语言功能:寻找字节集
  58.         /// </summary>
  59.         /// <param name="data"></param>
  60.         /// <param name="targetObj"></param>
  61.         /// <returns></returns>
  62.         public static int InBin(this byte[] data,byte[] searcjObj)
  63.         {
  64.             int curIndex = 0, start = -1,end = -1,searIndex = 0;
  65.             for (int x = 0; x < data.Length; x++)
  66.             {
  67.                 curIndex++;
  68.                 if (data[x] == searcjObj[searIndex])
  69.                 {
  70.                     if (searIndex == 0)
  71.                     {
  72.                         start = x;
  73.                     }
  74.                     if (searIndex == searcjObj.Length - 1)
  75.                     {
  76.                         end = x;
  77.                         searIndex = 0;
  78.                     }
  79.                     else
  80.                     {
  81.                         searIndex++;
  82.                     }
  83.                 }
  84.                 else
  85.                 {
  86.                     searIndex = 0;
  87.                 }
  88.             }
  89.             return start;
  90.         }

  91.         /// <summary>
  92.         /// E语言功能:取字节集中间
  93.         /// </summary>
  94.         /// <param name="data"></param>
  95.         /// <param name="startPos"></param>
  96.         /// <param name="len"></param>
  97.         /// <returns></returns>
  98.         public static byte[] BinMid(this byte[] data,int startPos,int len)
  99.         {
  100.             try
  101.             {
  102.                 return data.Range(startPos, len).ToArray();
  103.             }
  104.             catch(Exception ex)
  105.             {
  106.                 throw new ArgumentException(ex.Message);
  107.             }
  108.         }

  109.         /// <summary>
  110.         /// E语言功能:取字节集右边
  111.         /// </summary>
  112.         /// <param name="data"></param>
  113.         /// <param name="len"></param>
  114.         /// <returns></returns>
  115.         public static byte[] BinRight(this byte[] data, int len)
  116.         {
  117.             try
  118.             {
  119.                 var res = data.Tail(len);
  120.                 return res.ToArray();
  121.             }
  122.             catch(Exception ex)
  123.             {
  124.                 throw new ArgumentException(ex.Message);
  125.             }
  126.         }

  127.         /// <summary>
  128.         /// E语言功能:取字节集左边
  129.         /// </summary>
  130.         /// <param name="data"></param>
  131.         /// <param name="len"></param>
  132.         /// <returns></returns>
  133.         public static byte[] BinLeft(this byte[] data,int len)
  134.         {
  135.             try
  136.             {
  137.                 var res = data.Take(len).ToArray();
  138.                 return res;
  139.             }
  140.             catch(Exception ex)
  141.             {
  142.                 throw new ArgumentException("BinLeft()出错,请检查参数!");
  143.             }
  144.         }

  145.         /// <summary>
  146.         /// E语言功能:取字节集数据
  147.         /// </summary>
  148.         /// <param name="data"></param>
  149.         /// <param name="dataType"></param>
  150.         /// <param name="index"></param>
  151.         /// <returns></returns>
  152.         public static object GetBinElement(this byte[] data,Type dataType,int index)
  153.         {
  154.             object resObj = null;
  155.             if (dataType.isSimpleDataType())
  156.             {
  157.                 do
  158.                 {
  159.                     var byteList = new List<byte>();
  160.                     
  161.                     if (dataType == typeof(string))
  162.                     {
  163.                         var tmp=data.Copy().Tail(data.Length - index);
  164.                         resObj = Encoding.Default.GetString(tmp.ToArray()); break;
  165.                     }

  166.                 } while (false);
  167.                 return resObj;
  168.             }
  169.             else
  170.             {
  171.                 throw new ArgumentException("只有简单数据类型(非构造类型)才可以'取字节集数据'");
  172.             }
  173.         }
  174.         /// <summary>
  175.         /// E语言功能:到字节集()
  176.         /// <para>仅限于简单数据类型转为字节集</para>
  177.         /// <para>异常:ArgumentException</para>
  178.         /// </summary>
  179.         /// <typeparam name="T"></typeparam>
  180.         /// <param name="data"></param>
  181.         /// <returns></returns>
  182.         public static byte[] toBin<T>(T data)
  183.         {
  184.             var res = new byte[] { };
  185.             var t1 = data.GetType();
  186.             var size = ConvertHelper.getVarSizeOf(data);
  187.             if (size > 0)
  188.             {
  189.                 do
  190.                 {
  191.                     if (t1 == typeof(string))
  192.                     {
  193.                         res = Encoding.Default.GetBytes(data.ToString()); break;
  194.                     }
  195.                     var s = ConvertHelper.ConvertBase(data, 10, 16);
  196.                     var tmp = new List<string>();
  197.                     var sb1 = new StringBuilder();
  198.                     int js = 0;

  199.                     foreach (var m in s)
  200.                     {
  201.                         sb1.Append(m);
  202.                         if (++js == 2) { js = 0; tmp.Add(sb1.ToString()); sb1.Clear(); }
  203.                     }
  204.                     var tmp2 = tmp.ToList().ConvertAll(s1 => ConvertHelper.HexToByte(s1));
  205.                     tmp2.Reverse();
  206.                     res = tmp2.ToArray();

  207.                 } while (false);
  208.             }
  209.             else
  210.             {
  211.                 throw new ArgumentException("只有简单数据类型(非构造类型)才可以转为字节集byte[]");
  212.             }
  213.             return res;
  214.         }
  215.     }
复制代码
另附上几个用到的扩展方法:

  1. /// <summary>
  2.     /// 判定Type是不是简单数据型
  3.     /// </summary>
  4.     /// <param name="dataType"></param>
  5.     /// <returns></returns>
  6.     public static bool isSimpleDataType(this Type dataType)
  7.     {
  8.         var dAry = new List<Type>() { typeof(string), typeof(int),typeof(long),typeof(short),typeof(ushort),
  9.             typeof(bool),typeof(float), typeof(double),typeof(UInt16),typeof(UInt32),typeof(UInt64),typeof(decimal) };
  10.         foreach(var m in dAry)
  11.         {
  12.             if (dataType == m) return true;
  13.         }
  14.         return false;
  15.     }
复制代码

  1. public static byte[] Replace1(this byte[] sourceByteArray, byte[] oldValue, byte[] newValue)
  2.         {
  3.             //创建新数据多出1字节  
  4.             int newArrayLen = (int)((newValue.Length / (double)oldValue.Length) * sourceByteArray.Length) + 1;
  5.             //得到数组长度  
  6.             newArrayLen = Math.Max(newArrayLen, sourceByteArray.Length);
  7.             //新的最后结果数组  
  8.             byte[] newByteArray = new byte[newArrayLen];
  9.             //新数组的当前索引  
  10.             int curIndex = 0;
  11.             //开始结束  
  12.             int start = -1;
  13.             int end = -1;
  14.             //当前查找到的索引  
  15.             int oldCurindex = 0;
  16.             //替换数据替换  
  17.             for (int x = 0; x < sourceByteArray.Length; x++)
  18.             {
  19.                 newByteArray[curIndex] = sourceByteArray[x];
  20.                 curIndex++;
  21.                 //查找要替换的数据  
  22.                 if (sourceByteArray[x] == oldValue[oldCurindex])
  23.                 {
  24.                     if (oldCurindex == 0)
  25.                     {
  26.                         start = x;
  27.                     }
  28.                     if (oldCurindex == oldValue.Length - 1)
  29.                     {
  30.                         end = x;
  31.                         oldCurindex = 0;
  32.                     }
  33.                     else
  34.                     {
  35.                         oldCurindex++;
  36.                     }
  37.                 }
  38.                 else
  39.                 {
  40.                     oldCurindex = 0;
  41.                 }
  42.                 //数据查找完成  
  43.                 if (start != -1 && end != -1)
  44.                 {
  45.                     if (curIndex > 0)
  46.                     {
  47.                         curIndex -= 1;
  48.                     }
  49.                     curIndex -= end - start;

  50.                     //复制替换数据  
  51.                     Buffer.BlockCopy(newValue, 0, newByteArray, curIndex, newValue.Length);
  52.                     //计算新数组的偏移量  
  53.                     curIndex += newValue.Length;
  54.                     //重新设置需要复制索引的索引  
  55.                     start = end = -1;
  56.                 }
  57.             }

  58.             //处理返回结果  
  59.             byte[] result = null;
  60.             if (curIndex != 0)
  61.             {
  62.                 result = new byte[curIndex];
  63.                 Buffer.BlockCopy(newByteArray, 0, result, 0, result.Length);
  64.             }
  65.             else
  66.             {
  67.                 result = new byte[sourceByteArray.Length];
  68.                 Buffer.BlockCopy(sourceByteArray, 0, result, 0, result.Length);
  69.             }
  70.             return result;
  71.         }
复制代码




您可以选择打赏方式支持楼主

发表于 2018-9-14 22:17:58 | 显示全部楼层
ConvertHelper 这个类请发下代码
回复

使用道具 举报

 楼主| 发表于 2018-7-23 08:50:47 | 显示全部楼层
哦,忘了一件事,“取字节集数据”这个指令没写完整,有时间我会补上去。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

快速回复 收藏帖子 返回列表 按钮

sitemap|易语言源码|易语言教程|易语言论坛|诚聘英才|易语言模块|手机版|联系我们|精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.2 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125

快速回复 返回顶部 返回列表