예제 #1
0
		public static ulong ToUInt64(string value, int fromBase)
		{
			// 使用内置方法,会快一些。
			if (fromBase == 2 || fromBase == 8 || fromBase == 10 || fromBase == 16)
			{
				return Convert.ToUInt64(value, fromBase);
			}
			// 使用自己的算法。
			if (value == null)
			{
				return 0UL;
			}
			CheckBaseConvert(value, fromBase);
			ulong result = 0;
			ulong ulBase = (ulong)fromBase;
			for (int i = 0; i < value.Length; i++)
			{
				int t = GetBaseValue(value[i], fromBase);
				if (t < 0)
				{
					if (i == 0)
					{
						throw CommonExceptions.NoParsibleDigits();
					}
					else
					{
						throw CommonExceptions.ExtraJunkAtEnd();
					}
				}
				ulong next = unchecked(result * ulBase + (ulong)t);
				// 判断是否超出 UInt64 的范围。
				if (next < result)
				{
					throw CommonExceptions.OverflowUInt64();
				}
				result = next;
			}
			return result;
		}
예제 #2
0
        /// <summary>
        /// 将指定基的数字的字符串表示形式转换为等效的 <c>64</c> 位无符号整数。
        /// </summary>
        /// <param name="value">包含要转换的数字的字符串,使用不区分大小写的字母表示大于 <c>10</c> 的数。</param>
        /// <param name="fromBase"><paramref name="value"/> 中数字的基数。</param>
        /// <returns>与 <paramref name="value"/> 中数字等效的 <c>64</c> 位无符号整数,
        /// 如果 <paramref name="value"/> 为 <c>null</c>,则为 <c>0</c>(零)。</returns>
        /// <exception cref="OverflowException"><paramref name="value"/> 前面带一个负号。</exception>
        /// <exception cref="FormatException"><paramref name="value"/> 包含的一个字符不是 <paramref name="fromBase"/>
        /// 指定的基中的有效数字。如果 <paramref name="value"/> 中的第一个字符无效,异常消息则指示没有可转换的数字;
        /// 否则,该消息将指示 <paramref name="value"/> 包含无效的尾随字符。</exception>
        /// <exception cref="OverflowException"><paramref name="value"/> 表示大于 <see cref="UInt64.MaxValue"/>
        /// 的数字。</exception>
        private static ulong StringToUInt64(string value, int fromBase)
        {
            Contract.Requires(fromBase >= 2 && fromBase <= 36);
            if (value == null)
            {
                return(0);
            }
            if (value.Length == 0)
            {
                throw CommonExceptions.NoParsibleDigits();
            }
            if (value[0] == '-')
            {
                throw CommonExceptions.NegativeUnsigned();
            }
            ulong result = 0;
            ulong ulBase = (ulong)fromBase;

            for (int i = 0; i < value.Length; i++)
            {
                int t = GetBaseValue(value[i], fromBase);
                if (t < 0)
                {
                    if (i == 0)
                    {
                        throw CommonExceptions.NoParsibleDigits();
                    }
                    throw CommonExceptions.ExtraJunkAtEnd();
                }
                ulong next = unchecked (result * ulBase + (uint)t);
                // 判断是否超出 UInt64 的范围。
                if (next < result)
                {
                    throw CommonExceptions.OverflowUInt64();
                }
                result = next;
            }
            return(result);
        }