精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

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

2018年好项目,每月多挣好多钱收抖音火山王者引流:1513888885长期 包养全网交友粉大户┏ E3 E5 X58超强双路服务器 ┓找软件作者合作/收购引流软件出售长短效HTTP-S5私密IP-高质量
2018年好项目,每月多挣好多钱收抖音火山王者引流:1513888885长期 包养全网交友粉大户┃单进程单IP每个模拟器IP不同┃找软件作者合作/收购引流软件出售长短效HTTP-S5私密IP-高质量
全国PPTP秒换IP 动态IP仅35元/月┏█收购一切流量Q:503830000█┓长期 包养全网交友粉大户┗价格美丽。性能无敌 请咨询┛找软件作者合作/收购引流软件出售长短效HTTP-S5私密IP-高质量
▇▇QQ方面最新软件▇▇●国内外动态socks5 可API控制●长期 包养全网交友粉大户诺宾混拨动态vps/PPTP多地区换IP找软件作者合作/收购引流软件长期出QQ群QQ号微信精准粉网挣粉
大量租售各种qq小号 2892721932出兼职,网赚,交友粉,扫码进群各种【活粉变现点这里】客服①大量出小白兼职宝妈网赚粉找软件作者合作/收购引流软件找实力公司合作
┏集团收量一手短信群fa邮件群发┓╔ 收粉丶卖粉丶大型①群 ╗各种【活粉变现点这里】客服①高价收购漂流瓶量找软件作者合作/收购引流软件寻求实力团队
┃集团收量一手短信群fa邮件群发┃ 收粉丶卖粉丶大型①群各种【活粉变现点这里】客服②高价收购漂流瓶量找软件作者合作/收购引流软件高效率合作,
┃集团收量一手短信群fa邮件群发┃ 收粉丶卖粉丶大型①群各种【活粉变现点这里】客服②高价收购漂流瓶量找软件作者合作/收购引流软件欢迎来扰!!
┃集团收量一手精准号码微信推广┃收粉丶卖粉丶大型①群各种【活粉变现点这里】客服③高价收购漂流瓶量实力团队大量收粉入群找管理无限收任何量
┗集团收量一手精准号码微信推广┛收粉丶卖粉丶大型①群各种【活粉变现点这里】客服③高价收购漂流瓶量实力团队大量收粉入群找管理无限收任何量
工作室长期出粉,需要的撩我收粉丶卖粉丶大型①群██大量收婚恋宝妈 快手 火山█████大量全新令牌QQ███实力团队大量收粉入群找管理无限收任何量
工作室长期出粉,需要的撩我收粉丶卖粉丶大型①群██ 稳定收交友粉,找我换钱 █████大量全新令牌QQ███实力团队大量收粉入群找管理无限收任何量
工作室长期出粉,需要的撩我╚ 收粉丶卖粉丶大型①群 ╝██收婚恋粉宝妈粉,找我换钱███收收收高质量交友粉收收收██实力团队大量收粉入群找管理无限收任何量
工作室长期出粉,需要的撩我大量收精准粉██收快手火山虎牙,找我换钱██收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理拒绝骗子
工作室长期出粉,需要的撩我大量收精准粉██长期大量收粉量大量小都吃██收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理拒绝骗子
█无限收各种精准网赚资源█大量收精准粉██ 婚恋/抖音/宝妈/空间/快手██收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理无限收任何量
█无限收各种精准引流资源█大量收精准粉███有量有质量,找我换钱███收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理无限收任何量
█无限收各种群fa指定话术█各种家庭量███实力大型公司收媒体量███收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理无限收任何量
█无限收各种小视频引流粉█各种家庭量███大量资金,来一手代理███收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理无限收任何量
█无限收各种精准网赚资源█各种家庭量███有量就有钱,速度来撩███收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理无限收任何量
█有量支持引QQ/Q群/微信██长期大量收购各种活粉█┃  全网大量收  ┃收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理收男粉微信扫码进群QQ1324888881
█欢迎实力来撩,点击进Q群██ 长期收购各种引流软件 █┃ 各种App交友粉 ┃收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理收男粉微信扫码进群QQ1324888881
█加星盟社群支持免费担保█大量国外微信老号出售┃   网赚粉   ┃收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理大量收男粉扫码进群QQ1324888881
█无限收粉量真实长期合作█▇大量批发高质量QQ处号9位10位▇┃   游戏粉   ┃收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理收男粉微信扫码进群QQ1324888881
█星盟社Q群号码868977025█▇大量批发高质量QQ处号9位10位▇┃   婚恋粉   ┃收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理收男粉微信扫码进群QQ1324888881
┃高薪诚聘┃安卓市场APP上架人才█8█收批量自动加qq好友软件█8█┃  各种活人粉  ┃收高质量交友粉/只看质量不计成本实力团队大量收粉入群找管理『实力收扫码进群量』
┃高薪诚聘┃安卓市场APP上架人才█8█收批量自动加qq好友软件█8█┃   短视频粉  ┃█收收收高质量交友粉收收收██实力团队大量收粉入群找管理『你量真,我需求大』
┃高薪诚聘┃安卓市场APP上架人才出少量网赚粉+微信:qunfa000┃ 全网最高单价收购 ┃大量高价收网赚兼职粉,不限平台实力团队大量收粉入群找管理『 你不乱,我不断 』
┃高薪诚聘┃安卓市场APP上架人才出少量网赚粉+微信:qunfa000寻求 媒体量合作 有资源的撩我大量高价收网赚兼职粉,不限平台寻引流高手合作/1万粉以下勿扰
『欢迎实力粉商来撩』
┃高薪诚聘┃安卓市场APP上架人才公司实力收引流软件渠道寻求 媒体量合作 有资源的撩我大量高价收网赚兼职粉,不限平台寻引流高手合作/1万粉以下勿扰
『 →qq:12587210←』
出兼职粉有实力的来公司实力收引流软件渠道寻求 媒体量合作 有资源的撩我大量收微信男粉QQ249813919寻引流高手合作/1万粉以下勿扰█全新处Q██活令牌Q██邮箱Q█
出微信qq交友粉网赚粉精准粉兼职大量出探探交友粉联系Q1962626235寻求 媒体量合作 有资源的撩我█微博全新█4级白号█0.18/个█寻引流高手合作/1万粉以下勿扰█IP精灵█最强大的动态IP加速器
██QQ小号1毛钱/太阳Q/各类QQ██大量出网赚粉/各种粉/各类用户资源寻求 媒体量合作 有资源的撩我出高质量微信男粉QQ:644949998寻引流高手合作/1万粉以下勿扰出网赚粉兼职粉各种男女粉
邮箱代发,进箱率高,可测试
收大量微信裂变粉 2820301656
大量出活令牌处号一个月号收购跳转微信QQ加粉量Q88128851寻引流高手合作/1万粉以下勿扰█大量高价收QQ双向群+Q402345█
高价收网赚粉 / 兼职粉,平台不限收微信扫码进群男粉QQ:854122288大量出活令牌处号一个月号█拨号VPS服务器4元/天免费测试█寻引流高手合作/1万粉以下勿扰出Q群粉联系QQ:492544249
大量出微信 QQ 群网赚粉 精准活粉大公司大量收微信扫群网赚小白粉大量出活令牌处号一个月号多渠道引流,量大来谈寻引流高手合作/1万粉以下勿扰我要租广告位
查看: 1038|回复: 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

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