开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


求职/招聘- 论坛接单- 开发者大厅

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

查看: 6328|回复: 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: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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