using System; using System.Collections.Generic; using System.Linq; using System.Text; using Mesnac.Maths; using System.Collections; namespace Mesnac.Math.Default { #region 位计算函数 /// /// 位计算函数类 /// public class Bit : IMath { private object NullResult = null; public string Name { get { return "位计算"; } } public string Caption { get { StringBuilder sb = new StringBuilder(); sb.AppendLine("按位进行数据计算。返回int类型"); sb.AppendLine("例:"); sb.Append(" ").Append(Name).AppendLine("(1)"); sb.Append(" ").Append(Name).AppendLine("(1,2)"); return sb.ToString(); } } private int Execute(int index, int len, int[] buff) { if (buff.Length == 0) { return 0; } int source = (int)buff[0]; int addInt = 1; addInt = (addInt << (index + 1)) - 1; int result = source & addInt; result = result >> (index + 1 - len); return result; } public object Execute(string[] parameters, object[] buff) { if (buff.Length == 0) { return this.NullResult; } int[] _buff = new int[buff.Length]; for (int i = 0; i < buff.Length; i++) { object obj = buff[i]; if (obj != null) { int d = 0; if (int.TryParse(obj.ToString(), out d)) { _buff[i] = d; } } } if (parameters.Length == 1) { return Execute(Convert.ToInt16(parameters[0]), 1, _buff); } if (parameters.Length == 2) { return Execute(Convert.ToInt16(parameters[0]), Convert.ToInt16(parameters[1]), _buff); } return buff[0]; } } #endregion #region 除法函数 /// /// 除法函数类 /// public class Div : IMath { private object NullResult = null; public string Name { get { return "除法"; } } public string Caption { get { StringBuilder sb = new StringBuilder(); sb.AppendLine("计算第一个值除以固定值"); sb.AppendLine("例:"); sb.Append(" ").Append(Name).AppendLine("(100)"); return sb.ToString(); } } public object Execute(string[] parameters, object[] buff) { if (buff.Length == 0) { return this.NullResult; } if (buff[0] == null) { return this.NullResult; } if (parameters.Length > 0) { double d1 = 0; double d2 = 0; if ((double.TryParse(parameters[0], out d1)) && (double.TryParse(buff[0].ToString(), out d2))) { return d2 / d1; } } return buff[0]; } } #endregion #region Short除法函数 /// /// 进行Short类型转换后进行除法运算的函数类 /// public class ShortDiv : IMath { private object NullResult = null; public string Name { get { return "Short除法"; } } public string Caption { get { StringBuilder sb = new StringBuilder(); sb.AppendLine("进行Short类型转换后,计算第一个值除以固定值"); sb.AppendLine("例:"); sb.Append(" ").Append(Name).AppendLine("(100)"); return sb.ToString(); } } public object Execute(string[] parameters, object[] buff) { if (buff.Length == 0) { return this.NullResult; } if (buff[0] == null) { return this.NullResult; } if (parameters.Length > 0) { double d1 = 0; double d2 = 0; if ((double.TryParse(parameters[0], out d1)) && (double.TryParse(buff[0].ToString(), out d2))) { return (short)d2 / d1; } } return buff[0]; } } #endregion #region 时间函数(时分秒) public class FormatTimes : IMath { private object NullResult = null; #region IMath 成员 public string Name { get { return "时间格式化"; } } public string Caption { get { StringBuilder sb = new StringBuilder(); sb.AppendLine("时:分:秒 格式化"); sb.AppendLine("例:"); sb.Append(" ").Append(Name).AppendLine("(100)"); return sb.ToString(); } } public object Execute(string[] parameters, object[] buff) { if (buff.Length == 0) { return this.NullResult; } if (buff[0] == null) { return this.NullResult; } string time = string.Empty; int h = 0; int m = 0; int s = 0; int times = (int)buff[0]; if (times / 3600 != 0) { h = times / 3600; time = (times / 3600).ToString().PadLeft(2, '0') + ":"; } else time = "00:"; if (times > 60) { m = (times - h * 3600) / 60; time += ((times - h * 3600) / 60).ToString().PadLeft(2, '0') + ":"; } else time = "00:"; time += ((times - h * 3600) - m * 60).ToString().PadLeft(2, '0'); return time; } #endregion } #endregion public class FormatHX : IMath { private object NullResult = null; #region IMath 成员 public string Name { get { return "十进制除"; } } public string Caption { get { StringBuilder sb = new StringBuilder(); sb.AppendLine("十六进制转化十进制除法"); sb.AppendLine("例:"); sb.Append(" ").Append(Name).AppendLine("(100)"); return sb.ToString(); } } public object Execute(string[] parameters, object[] buff) { if (buff.Length == 0) { return this.NullResult; } if (buff[0] == null) { return this.NullResult; } string ox = buff[0].ToString(); uint test; test = System.Convert.ToUInt32(ox, 16); //转换为10禁止 if (parameters.Length == 1) { double d1 = 0; double d2 = 0; if ((double.TryParse(parameters[0], out d1)) && (double.TryParse(test.ToString(), out d2))) { return d2 / d1; } } return test.ToString(); } #endregion public class BCDbit : IMath { #region IMath 成员 private object NullResult = null; public string Name { get { return "BCD位"; } } public string Caption { get { StringBuilder sb = new StringBuilder(); sb.AppendLine("转化为BCD位"); sb.AppendLine("例:"); sb.Append(" ").Append(Name).AppendLine("(0)"); return sb.ToString(); } } public object Execute(string[] parameters, object[] buff) { if (buff.Length == 0) { return this.NullResult; } int[] _buff = new int[buff.Length]; for (int i = 0; i < buff.Length; i++) { object obj = buff[i]; if (obj != null) { int d = 0; if (int.TryParse(obj.ToString(), out d)) { _buff[i] = d; } } } if (parameters.Length == 1) { return Execute(Convert.ToInt16(parameters[0]), 1, _buff); } return buff[0]; } object Execute(int index, int len, int[] buff) { string retValue = string.Empty; if (buff[0] == 0) return "0"; string Dec = buff[0].ToString(); string bv = string.Empty; for (int j = 0; j < Dec.Length; j++) { int[] bitValue = ParseBinaryValue(Convert.ToInt32(Dec.Substring(Dec.Length - 1 - j, 1)), 4); for (int i = 0; i < 4; i++) { bv += bitValue[i]; } retValue = bv + retValue; bv = string.Empty; } string temp = retValue.PadLeft(16, '0'); if (temp.Length == 16) retValue = temp.Substring(15 - index, 1); return retValue; } /// /// 解析二进制位 /// /// 要解析的变量 /// 解析的长度 /// 返回解析的二进制值数组 int[] ParseBinaryValue(int x, int len) { int[] result = new int[len]; int b = 1; for (int i = len - 1; i >= 0; i--) { result[i] = (x & b) == 0 ? 0 : 1; b = b << 1; } return result; } #endregion } } }