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; }
/// <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); }