Skip to content

Instantly share code, notes, and snippets.

@igrek8
Created December 10, 2016 19:37
Show Gist options
  • Save igrek8/c6ef7532eca3f4fd85ee8805a0391e1b to your computer and use it in GitHub Desktop.
Save igrek8/c6ef7532eca3f4fd85ee8805a0391e1b to your computer and use it in GitHub Desktop.
Any base to any base number conversion
import java.util.Arrays;
public class HelloWorld {
public static String calcBase(final String value, final int fromBase, final int toBase) {
// схема по всех возможных цифр для любой системы счистелния (максимальная 64)
final char[] charArray = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
// схема цифр для изначальной системы счителния
final char[] fromRange = Arrays.copyOfRange(charArray, 0, fromBase);
// схема цифр для конечного числа
final char[] toRange = Arrays.copyOfRange(charArray, 0, toBase);
char ch; // цифра на которой мы сейчас
int acc = 0; // аккумулятор
int indexOfDigit = -1; // индекс цифры ch
for (int index = value.length() - 1; index >= 0; --index) {
ch = value.charAt(index);
// ищем индекс цифры ch в fromRange
for (int j = 0; j < fromRange.length; ++j) {
if (ch == fromRange[j]) {
// если нашли, завершаем цикл
indexOfDigit = j;
break;
}
}
// если по прежнему не нашли, то показываем ошибку, так как такой цифры не может быть для указанной системы счистления
if (indexOfDigit < 0) {
throw new Error("Invalid digit " + ch + " for base " + fromBase);
}
// если всё норм, добавляем в аккумулятор нашу цифру
acc += indexOfDigit * Math.pow(fromBase, value.length() - index - 1);
// сбрасываем
indexOfDigit = -1;
}
String convertedValue = "";
while(acc > 0) {
// строим наше число в нужной системе счистления
convertedValue = toRange[acc % toBase] + convertedValue;
acc = (acc - (acc % toBase)) / toBase;
}
// результат конвертации
return convertedValue;
}
public static void main(String[] args) {
System.out.println(calcBase("255", 10, 16));
System.out.println(calcBase("FF", 16, 10));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment