mirror of
https://github.com/chylex/Query.git
synced 2025-04-30 14:34:11 +02:00
79 lines
2.4 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|