1
0
mirror of https://github.com/chylex/Query.git synced 2025-04-30 14:34:11 +02:00
Query/AppConv/Utils/RadixConversion.cs

79 lines
2.4 KiB
C#

using System;
using System.Globalization;
using System.Linq;
using System.Text;
namespace AppConv.Utils{
internal static class RadixConversion{
private const string Characters = "0123456789ABCDEF";
public static bool IsBaseValid(int checkedBase){
return checkedBase >= 1 && checkedBase <= 16;
}
public static bool IsNumberValid(string contents, int checkedBase){
if (checkedBase == 1){
return contents.All(chr => chr == '1');
}
if (IsBaseValid(checkedBase)){
return contents.Select(chr => Characters.IndexOf(char.ToUpper(chr))).All(index => index != -1 && index < checkedBase);
}
return false;
}
public static string Do(string contents, int fromBase, int toBase){ // TODO biginteger
if (fromBase == 1){
contents = contents.Length.ToString(CultureInfo.InvariantCulture);
fromBase = 10;
}
long wip;
if (fromBase == 10){
wip = long.Parse(contents, NumberStyles.None, CultureInfo.InvariantCulture);
}
else{
wip = 0;
for(int chr = 0; chr < contents.Length; chr++){
int index = Characters.IndexOf(char.ToUpperInvariant(contents[chr]));
if (index > 0){
wip += index*(long)Math.Pow(fromBase, contents.Length-chr-1);
if (wip < 0){
throw new OverflowException();
}
}
}
}
if (toBase == 1){
if (wip <= int.MaxValue){
return new string('1', (int)wip);
}
else{
throw new OverflowException();
}
}
else if (wip < toBase){
return Characters[(int)wip].ToString();
}
else{
StringBuilder converted = new StringBuilder();
while(wip >= toBase){
int index = (int)(wip%toBase);
converted.Insert(0, Characters[index]);
wip = wip/toBase;
}
return converted.Insert(0, Characters[(int)wip]).ToString();
}
}
}
}