/// <summary> /// 对给定的基数和字符串进行检查。 /// </summary> /// <param name="value">包含要转换的数字的字符串, /// 使用不区分大小写的字母表示大于 <c>10</c> 的数。</param> /// <param name="fromBase"><paramref name="value"/> 中数字的基数, /// 它必须位于 <c>2</c> 到 <c>36</c> 之间。</param> /// <exception cref="System.ArgumentOutOfRangeException"> /// <paramref name="fromBase"/> 不是 <c>2</c> 到 <c>36</c> 之间的数字。</exception> /// <exception cref="System.FormatException"> /// <paramref name="value"/> 表示一个非 <c>10</c> 为基的有符号数, /// 但前面带一个负号。</exception> private static void CheckBaseConvert(string value, int fromBase) { // 基数检查。 if (fromBase < 3 || fromBase > 36) { throw ExceptionHelper.InvalidBase("toBase"); } if (value.Length == 0) { throw ExceptionHelper.NoParsibleDigits(); } // 负号检查。 if (value[0] == '-') { throw ExceptionHelper.BaseConvertNegativeValue(); } }
/// <summary> /// 将 <c>64</c> 位无符号整数的值转换为其指定基的等效字符串表示形式。 /// </summary> /// <param name="buffer">字符串的缓冲区。</param> /// <param name="value">要转换的 <c>64</c> 位无符号整数。</param> /// <param name="toBase">返回值的基数,必须位于 <c>2</c> 到 <c>36</c> 之间。</param> /// <returns>转换后字符串的起始索引。</returns> /// <exception cref="System.ArgumentException"> /// <paramref name="toBase"/> 不是 <c>2</c> 到 <c>36</c> 之间的数字。</exception> private static int ConvertBase(char[] buffer, ulong value, int toBase) { if (toBase < 2 || toBase > 36) { throw ExceptionHelper.InvalidBase("toBase"); } // 从后向前转换,不必反转字符串。 ulong ulBase = (ulong)toBase; int idx = buffer.Length - 1; do { ulong quot = value / ulBase; buffer[idx--] = CharExt.BaseDigits[value - quot * ulBase]; value = quot; } while (value > 0); return(idx + 1); }