static public object DoubleStrToNum(string str, int baseMark) { object value = null; try { switch (baseMark) { case 10: { value = Double.Parse(str, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite); break; } case 16: { string tmpStr = ""; Int64 tmp = (Int64)CommonTool.StrToNum(TypeCode.Int64, str, 16); if ((tmp & (Int64)(((Int64)1) << 63)) != 0) { tmpStr = Convert.ToString(tmp, 2); } else { tmp = tmp | (Int64)(((Int64)1) << 63); tmpStr = Convert.ToString(tmp, 2); tmpStr = '0' + tmpStr.Substring(1); } tmpStr = tmpStr + new string('0', 64 - tmpStr.Length); string str1 = tmpStr.Substring(0, 1); string str2 = tmpStr.Substring(1, 16); string str3 = tmpStr.Substring(17); UInt16 num1 = (UInt16)CommonTool.StrToNum(TypeCode.UInt16, str2, 2); int num2 = Convert.ToInt32(num1); if (num2 > (32767 + 23)) { return(Double.MaxValue); } else if (num1 < 32767) { double dtmp = 0; for (int i = 0; i < str3.Length; i++) { if (str3[i] == '1') { dtmp += (double)1 / (double)(Math.Pow(2, (i + 1))); } } double result = dtmp; if (str1 == "1") { return(0 - result); } else { return(result); } } else { string stra1 = str3.Substring(0, num1 - 32767); string stra2 = str3.Substring(num1 - 32767); object left = CommonTool.StrToNum(TypeCode.UInt64, stra1, 2); double dtmp = 0; for (int i = 0; i < stra2.Length; i++) { if (stra2[i] == '1') { dtmp += (double)1 / (double)(Math.Pow(2, (i + 1))); } } double result = Convert.ToDouble(left) + dtmp; if (str1 == "1") { return(0 - result); } else { return(result); } } } } } catch (System.Exception) { value = null; } return(value); }
static public string DoubleNumToStr(double value, string baseMark, bool ifAlignment) { switch (baseMark) { case "D": { return(value.ToString()); } case "X": { double tmp = 0; if (value < 0) { tmp = 0 - value; } else { tmp = value; } string tmpStr = tmp.ToString(); string[] str = tmpStr.Split(new char[1] { '.' }, StringSplitOptions.RemoveEmptyEntries); Int64 tmpint = (Int64)CommonTool.StrToNum(TypeCode.Int64, str[0], 10); string leftStr = Convert.ToString(tmpint, 2); string rightStr = ""; if (str.Length > 1) { double orginal = Convert.ToDouble(tmp); double intPart = Convert.ToDouble(tmpint); double floatPart = orginal - intPart; while (true) { if (leftStr.Length + rightStr.Length >= 47) { break; } floatPart = floatPart * 2; if (floatPart > (double)1) { floatPart = floatPart - (double)1; rightStr += "1"; } else { rightStr += "0"; } } } string middle = ""; if (leftStr == "0") { leftStr = ""; middle += "0111111111111111"; } else { middle = Convert.ToString(leftStr.Length + 32767, 2); middle = middle + new string('0', 16 - middle.Length); } string headerStr = (value > (double)0) ? "0" : "1"; string tmpStrNew = leftStr + rightStr; if (tmpStrNew.Length < 47) { tmpStrNew = tmpStrNew + new string('0', 47 - tmpStrNew.Length); } string result = headerStr + middle + tmpStrNew; Int64 resultInt = Convert.ToInt64(result, 2); result = CommonTool.NumToStr(TypeCode.Int64, resultInt, "X", true); return(result); } } return("0000000000000000"); }
static public object FloatStrToNum(string str, int baseMark) { object value = null; try { switch (baseMark) { case 10: { value = Single.Parse(str, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite); break; } case 16: { string tmpStr = ""; Int32 tmp = (Int32)CommonTool.StrToNum(TypeCode.Int32, str, 16); if ((tmp & (1 << 31)) != 0) { tmpStr = Convert.ToString(tmp, 2); } else { tmp = tmp | (1 << 31); tmpStr = Convert.ToString(tmp, 2); tmpStr = '0' + tmpStr.Substring(1); } tmpStr = tmpStr + new string('0', 32 - tmpStr.Length); string str1 = tmpStr.Substring(0, 1); string str2 = tmpStr.Substring(1, 8); string str3 = tmpStr.Substring(9); byte num1 = (byte)CommonTool.StrToNum(TypeCode.Byte, str2, 2); int num2 = Convert.ToInt32(num1); if (num2 > (127 + 23)) { return(float.MaxValue); } else if (num1 < 127) { double dtmp = 0; for (int i = 0; i < str3.Length; i++) { if (str3[i] == '1') { dtmp += (double)1 / (double)(Math.Pow(2, (i + 1))); } } float result = Convert.ToSingle(dtmp); if (str1 == "1") { return(0 - result); } else { return(result); } } else { string stra1 = str3.Substring(0, num1 - 127); string stra2 = str3.Substring(num1 - 127); object left = CommonTool.StrToNum(TypeCode.UInt32, stra1, 2); double dtmp = 0; for (int i = 0; i < stra2.Length; i++) { if (stra2[i] == '1') { dtmp += (double)1 / (double)(Math.Pow(2, (i + 1))); } } float result = Convert.ToSingle(left) + Convert.ToSingle(dtmp); if (str1 == "1") { return(0 - result); } else { return(result); } } } } } catch (System.Exception) { value = null; } return(value); }