求 C# 36进制转换成10进制的源码

bzkerchina 2012-01-02 01:45:21
以上是10进制转换成 16进制到36进制的源码,
求36进制转换成10进制的源码


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
textBox3.Text = Convert(int.Parse(textBox1.Text), int.Parse(textBox2.Text));

}

private string Convert(int n, int Base)
{
bool gt0 = true;
if (Base < 10 || Base > 36) return null;
if (n == 0) return "0";
if (n < 0)
{
n = -n;
gt0 = false;
}
StringBuilder sb = new StringBuilder();
string t = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
while (n > 0)
{
sb.Append(t[n % Base]);
n /= Base;
}
t = sb.ToString();
n = t.Length;
sb.Length = 0;
if (!gt0) sb.Append("-");
while (--n >= 0) sb.Append(t[n]);
return sb.ToString();
}
}
}


以上是10进制转换成 16进制到36进制的源码,
求36进制转换成10进制的源码
...全文
783 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bzkerchina 2012-01-03
  • 打赏
  • 举报
回复
这个是2-36进制,可以任意进制互转的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AnyConvertx2x
{
/// <summary>
/// 数字进制转换类
/// </summary>
public class AnyConvert
{
private static char[] rDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U','V', 'W', 'X', 'Y', 'Z' };

/// <summary>
/// 将指定基数的数字的 System.String 表示形式转换为等效的 64 位有符号整数。
/// </summary>
/// <param name="value">包含数字的 System.String。</param>
/// <param name="fromBase">value 中数字的基数,它必须是[2,36]</param>
/// <returns>等效于 value 中的数字的 64 位有符号整数。- 或 - 如果 value 为 null,则为零。</returns>
private long x2h(string value, int fromBase)
{
value = value.Trim();
if (string.IsNullOrEmpty(value))
{
return 0L;
}

string sDigits = new string(rDigits, 0, fromBase);
long result = 0;
//value = reverse(value).ToUpper(); 1
value = value.ToUpper();// 2
for (int i = 0; i < value.Length; i++)
{
if (!sDigits.Contains(value[i].ToString()))
{
throw new ArgumentException(string.Format("The argument \"{0}\" is not in {1} system.", value[i], fromBase));
}
else
{
try
{
//result += (long)Math.Pow(fromBase, i) * getcharindex(rDigits, value[i]); 1
result += (long)Math.Pow(fromBase, i) * getcharindex(rDigits, value[value.Length - i - 1]);// 2
}
catch
{
throw new OverflowException("运算溢出.");
}
}
}

return result;
}

private int getcharindex(char[] arr, char value)
{
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] == value)
{
return i;
}
}
return 0;
}

//long转化为toBase进制
private string h2x(long value, int toBase)
{
int digitIndex = 0;
long longPositive = Math.Abs(value);
int radix = toBase;
char[] outDigits = new char[63];

for (digitIndex = 0; digitIndex <= 64; digitIndex++)
{
if (longPositive == 0) { break; }

outDigits[outDigits.Length - digitIndex - 1] =
rDigits[longPositive % radix];
longPositive /= radix;
}

return new string(outDigits, outDigits.Length - digitIndex, digitIndex);
}


/// <summary>
/// 任意进制转换,将fromBase进制表示的value转换为toBase进制
/// </summary>
/// <param name="value"></param>
/// <param name="fromBase">原来进制(2-36进制)</param>
/// <param name="toBase">转换后的进制(2-36进制)</param>
/// <returns></returns>
public string X2X(string value, int fromBase, int toBase)
{
if (string.IsNullOrEmpty(value.Trim()))
{
return string.Empty;
}

if (fromBase < 2 || fromBase > 36)
{
throw new ArgumentException(String.Format("The fromBase radix \"{0}\" is not in the range 2..36.", fromBase));
}

if (toBase < 2 || toBase > 36)
{
throw new ArgumentException(String.Format("The toBase radix \"{0}\" is not in the range 2..36.", toBase));
}

long m = x2h(value, fromBase);
string r = h2x(m, toBase);
return r;
}
}
}



调用使用类

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AnyConvertx2x;

namespace AnyRadixConvert
{
public partial class Form1 : Form
{
public Form1()
{

InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
AnyConvert convert = new AnyConvert();
textBox2 .Text = convert.X2X(textBox1 .Text , 36, 10);//36 To 10
}

private void button2_Click(object sender, EventArgs e)
{
AnyConvert convert = new AnyConvert();
textBox2.Text = convert.X2X(textBox1.Text, 10, 36);//10 To 36
}
}
}
bzkerchina 2012-01-03
  • 打赏
  • 举报
回复
ConvertToInt 这个函数,输入数字是转不出来的
gzdiablo 2012-01-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bzkerchina 的回复:]

我输入了一个纯数字的字符,转换后还是原来的字符!
引用 5 楼 gzdiablo 的回复:
C# code
private int ConvertToInt32(char c)
{
if (c >= 48 &amp;&amp; c <= 57) { return c - 48; }
if (c >= 97 &amp;&amp; c <= 122) { ……
[/Quote]

呵呵没写清楚不好意思

不是调用ConvertToInt32这个函数
是ConvertToInt这个函数
threenewbee 2012-01-02
  • 打赏
  • 举报
回复
CustomBaseNumber cbn = new CustomBaseNumber("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
cbn.CustomBase = "123"; //36进制的123
int n = cbn.DecBase;
threenewbee 2012-01-02
  • 打赏
  • 举报
回复
还没解决?这种问题回答n次了。

http://topic.csdn.net/u/20110705/19/5b6bcbfe-ff78-4d7f-b5a0-1c8bfba5b694.html
bzkerchina 2012-01-02
  • 打赏
  • 举报
回复
我输入了一个纯数字的字符,转换后还是原来的字符!
[Quote=引用 5 楼 gzdiablo 的回复:]
C# code
private int ConvertToInt32(char c)
{
if (c >= 48 && c <= 57) { return c - 48; }
if (c >= 97 && c <= 122) { return c - 87; }
……
[/Quote]
  • 打赏
  • 举报
回复
用不着写那么多东西。

假设一个dic字符串里放置你的每一个字母,那么把一个存在变量value里边的36进制表示的数字的字符串转换为Long其实就是一句话:
string dic = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var result = value.Aggregate(0L, (sum, c) => sum * 36 + dic.IndexOf(c));


你然后在使用ToString就可以了,它默认就是把Long转换为十进制的字符串。
gzdiablo 2012-01-02
  • 打赏
  • 举报
回复
		private int ConvertToInt32(char c)
{
if (c >= 48 && c <= 57) { return c - 48; }
if (c >= 97 && c <= 122) { return c - 87; }
if (c >= 65 && c <= 90) { return c - 55; }
return 0;
}

public int ConvertToInt(string v, int fromBase)
{
char[] chars = v.ToCharArray();
Array.Reverse(chars);
int fb = 1;
int value = 0;
foreach(char aa in chars)
{
value += ConvertToInt32(aa) * fb;
fb *= fromBase;
}
return value;
}
bzkerchina 2012-01-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gzdiablo 的回复:]
C# code
public string ConvertToString(int v, int fromBase)
{
if (fromBase < 2 || fromBase > 36) throw new ArgumentException();
List<char> cs = new List<char……
[/Quote]
其实 10进制转36进制的代码我已经写出来了,

现在要的是 36进制转成 10进制的代码
gzdiablo 2012-01-02
  • 打赏
  • 举报
回复
		public string ConvertToString(int v, int fromBase)
{
if (fromBase < 2 || fromBase > 36) throw new ArgumentException();
List<char> cs = new List<char>(36);
while (v > 0)
{
int x = v % fromBase;
int c = 48;
if (x > 10) { c = 87; }
cs.Add((char)(x + c));
v /= fromBase;
}
cs.Reverse();
return new string(cs.ToArray());
}
threenewbee 2012-01-02
  • 打赏
  • 举报
回复
这种问题是小学生研究的问题。

会看钟表么?其实时间就是一个60进制(非2^n based)和10进制互转的例子。
zh6335901 2012-01-02
  • 打赏
  • 举报
回复
每位乘以36的n-1次方,n为第几位

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧