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
}
}
}