精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

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

若快打码 快速★准确★稳定★便宜2018年好项目,每月多挣好多钱长期 包养全网交友粉大户┏ E3 E5 X58超强双路服务器 ┓找软件作者合作/收购引流软件██打码兔秒杀一切验证码██
若快打码 快速★准确★稳定★便宜2018年好项目,每月多挣好多钱长期 包养全网交友粉大户┃单进程单IP每个模拟器IP不同┃找软件作者合作/收购引流软件█打码兔答题 速度快 极稳定█
全国PPTP秒换IP 动态IP仅35元/月火眼答题-韩文日文-高质量答题长期 包养全网交友粉大户┗价格美丽。性能无敌 请咨询┛找软件作者合作/收购引流软件┏█收购一切流量Q:503830000█┓
云速打码全天50%分成★稳定★快速▇QQ新科技软件▇随时更新▇长期 包养全网交友粉大户★滴滴答题★8元万码★分成任加★找软件作者合作/收购引流软件Thewolf语音验证码接收平台可API
诺宾混拨动态vps/PPTP多地区换IP█IP精灵█最强大的动态IP加速器各种【活粉变现点这里】客服①长期出QQ群QQ号微信精准粉网挣粉找软件作者合作/收购引流软件大量租售各种qq小号 2892721932
┏ 集团收量,高价无限收一切量 ┓╔ 收粉丶卖粉丶大型①群 ╗各种【活粉变现点这里】客服①高价收购任何微信QQ粉找软件作者合作/收购引流软件大量收QQ活粉交友粉
┃ 收量:短视频引流,直播平台粉┃ 收粉丶卖粉丶大型①群各种【活粉变现点这里】客服②高价收购任何微信QQ粉找软件作者合作/收购引流软件大量收QQ活粉交友粉
┃ 收量:各大招聘网站一手简历 ┃收粉丶卖粉丶大型①群各种【活粉变现点这里】客服②高价收购任何微信QQ粉找软件作者合作/收购引流软件大量收QQ活粉交友粉
┃ 收量:短信、邮箱qun发通道 ┃收粉丶卖粉丶大型①群各种【活粉变现点这里】客服③高价收购任何微信QQ粉寻求有项目的大神合作 收快手火山抖音 小视频引流
┗ 收粉:网赚粉/精准粉,交友粉 ┛收粉丶卖粉丶大型①群各种【活粉变现点这里】客服③高价收购任何微信QQ粉寻求有项目的大神合作 收快手火山抖音 小视频引流
┏公司实力高价 收 引流软件渠道┓收粉丶卖粉丶大型①群██大量收婚恋宝妈 快手 火山██实力公司日消耗大量QQ粉有货MM寻求有项目的大神合作 收快手火山抖音 小视频引流
┃公司实力高价 收 引流软件渠道┃收粉丶卖粉丶大型①群██ 稳定收交友粉,找我换钱 ██实力公司日消耗大量QQ粉有货MM寻求有项目的大神合作 收快手火山抖音 小视频引流
┃公司实力高价 收 引流软件渠道┃╚ 收粉丶卖粉丶大型①群 ╝██收婚恋粉宝妈粉,找我换钱██实力公司日消耗大量QQ粉有货MM寻求有项目的大神合作 收快手火山抖音 小视频引流
┃公司实力高价 收 引流软件渠道┃大量收精准粉██收快手火山虎牙,找我换钱██实力公司日消耗大量QQ粉有货MM寻求有项目的大神合作收网赚粉 / 精准粉 / 兼职粉
┃公司实力高价 收 引流软件渠道┃大量收精准粉██长期大量收粉量大量小都吃██实力公司日消耗大量QQ粉有货MM寻求有项目的大神合作收网赚粉 / 精准粉 / 兼职粉
┃公司实力收 qun 发 邮箱软件 ┃大量收精准粉██ 婚恋/抖音/宝妈/空间/快手██★高薪诚聘SEO大牛 高价买任何量★寻求有项目的大神合作收网赚粉 / 精准粉 / 兼职粉
┃公司实力收 qun 发 邮箱软件 ┃大量收精准粉███有量有质量,找我换钱███★高薪诚聘SEO大牛 高价买任何量★寻求有项目的大神合作收网赚粉 / 精准粉 / 兼职粉
┃公司实力收 qun 发 邮箱软件 ┃大量收精准粉███实力大型公司收媒体量███★高薪诚聘SEO大牛 高价买任何量★寻求有项目的大神合作收网赚粉 / 精准粉 / 兼职粉
┃公司实力收 qun 发 邮箱软件 ┃大量收精准粉███大量资金,来一手代理███★高薪诚聘SEO大牛 高价买任何量★寻求有项目的大神合作收精准粉、用户量、也可联运营
┃公司实力收 qun 发 邮箱软件 ┃大量收精准粉███有量就有钱,速度来撩███★高薪诚聘SEO大牛 高价买任何量★寻求有项目的大神合作收精准粉、用户量、也可联运营
┃公司最高价收 邮件qun发软件┃█长期大量收购各种活粉█┃  全网大量收  ┃███各类QQ小号███寻求有项目的大神合作收精准粉、用户量、也可联运营
┃公司最高价收 邮件qun发软件┃█ 长期收购各种引流软件 █┃ 各种App交友粉 ┃███各类QQ小号███寻求有项目的大神合作收精准粉、用户量、也可联运营
┃公司最高价收 邮件qun发软件┃大量微信寻合作 接各种扫码授权┃   网赚粉   ┃收抖音火山王者引流:1513888885寻求有项目的大神合作收精准粉、用户量、也可联运营
┃公司最高价收 邮件qun发软件┃大量出2年以上三无QQ 可秒绑微信┃   游戏粉   ┃收抖音火山王者引流:1513888885寻求有项目的大神合作收精准粉、用户量、也可联运营
┗公司最高价收 邮件qun发软件┛▇ 1卡绑10QQ 0月租 10张包邮 ▇┃   婚恋粉   ┃┃找邮件代发,邮件群发通道┃寻求有项目的大神合作收精准粉、用户量、也可联运营
██---收网吧量exe下发量---██收男粉微信扫码进群QQ1324888881┃  各种活人粉  ┃找QQ群,微博,微信朋友圈广告推广寻求有项目的大神合作收精准粉、用户量、也可联运营
██-----收PC量 下载站量-----██大量收男粉扫码进群QQ1324888881 ┃   短视频粉  ┃代发短信+邮件寻求有项目的大神合作收精准粉、用户量、也可联运营
██ 欢迎QQ产品类作者私聊 ██┃ 全新QQ一手批发 ┃┃ 全网最高单价收购 ┃代发短信+邮件寻求有项目的大神合作收精准粉、用户量、也可联运营
██完全无投诉静默不影响产品██┃ 全新QQ一手批发 ┃寻求 媒体量合作 有资源的撩我代发短信+邮件寻引流高手合作/1万粉以下勿扰十年暴利项目实地考察+上门服务
██日收入几K至1W+ 正规用途██☆收微信公众号粉丝.日结寻求 媒体量合作 有资源的撩我代发短信+邮件寻引流高手合作/1万粉以下勿扰十年暴利项目实地考察+上门服务
出少量网赚粉+微信:qunfa000☆收微信公众号粉丝.日结寻求 媒体量合作 有资源的撩我代发短信+邮件寻引流高手合作/1万粉以下勿扰十年暴利项目实地考察+上门服务
出少量网赚粉+微信:qunfa000日出大量网赚粉微信QQ各行精准活粉寻求 媒体量合作 有资源的撩我██ 日出大量网赚粉/交友粉 ██寻引流高手合作/1万粉以下勿扰███大量出租一手QQ粉███
高价收网吧量联系QQ2088724059出微信qq交友粉网赚粉精准粉兼职寻求 媒体量合作 有资源的撩我寻网吧端,下载站,各种端合作寻引流高手合作/1万粉以下勿扰★长期收购各种粉★引流软件★
收购跳转微信QQ加粉量Q88128851★动态S5.可换地区可混拨可定时★大量出活令牌处号一个月号██收网赚粉/收粉/卖粉/交易群█寻引流高手合作/1万粉以下勿扰出精准粉,量大来谈
====QQ小号====█拨号VPS服务器4元/天免费测试█大量出活令牌处号一个月号GPK AG OG流量交流群寻引流高手合作/1万粉以下勿扰出兼职粉有实力的来
大量收微信男粉QQ249813919收大量微信裂变粉Q2820301656大量出活令牌处号一个月号█全新处Q██活令牌Q██邮箱Q█寻引流高手合作/1万粉以下勿扰我要租广告位
查看: 579|回复: 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.         }
复制代码




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

发表于 5 天前 | 显示全部楼层
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

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