2013-04-20 3 views
2

Я рассмотрел много сообщений здесь о stackoverflow относительно этой проблемы, я нашел частичные решения, но до сих пор мне еще предстоит найти решение, которое работает на меня. new BigDecimal("3324679375210329505").toString(2); Кажется лучше работать для меня (от: Convert a large 2^63 decimal to binary), но мне нужны ведущие и конечные нули. В любом случае я могу преобразовать большой (более длинный) hex в двоичное (String) представление?Big Hex to binary

Заранее спасибо.

ответ

3

Класс BigInteger обрабатывает произвольно большие числа.

Обратные нули обрабатываются allready. Для обработки ведущих нулей, просто добавьте «1» на передней панели, что обеспечивает ведущую «1» бит, затем убирается обратно снова:

String bits = new BigInteger("1" + hex, 16).toStting(2).substring(1); 
+0

@jlordo Он делает: 'BigInteger (String ул, внутр радикс)' –

+0

@ValeriAtamaniouk: Да, вы правы , Я смотрел BgDecimal. Виноват. – jlordo

+0

Но я считаю, что это решение получает пробелы в ведущих нулях, и для правильного преобразования в base64 (моя конечная цель) мне нужны ведущие и конечные нули. –

2

Вы должны ведущие нули? Я не знаю, о встроенной функции, но вы можете легко реализовать его самостоятельно:

public static String hex2binary(String hex) { 
    StringBuilder result = new StringBuilder(hex.length() * 4); 
    for (char c : hex.toUpperCase().toCharArray()) { 
     switch (c) { 
     case '0': result.append("0000"); break; 
     case '1': result.append("0001"); break; 
     case '2': result.append("0010"); break; 
     case '3': result.append("0011"); break; 
     case '4': result.append("0100"); break; 
     case '5': result.append("0101"); break; 
     case '6': result.append("0110"); break; 
     case '7': result.append("0111"); break; 
     case '8': result.append("1000"); break; 
     case '9': result.append("1001"); break; 
     case 'A': result.append("1010"); break; 
     case 'B': result.append("1011"); break; 
     case 'C': result.append("1100"); break; 
     case 'D': result.append("1101"); break; 
     case 'E': result.append("1110"); break; 
     case 'F': result.append("1111"); break; 
     default: throw new IllegalArgumentException("Invalid hex: '" + hex + "'"); 
     } 
    } 
    return result.toString(); 
} 
+0

Ницца. Я подозреваю, что обработка строчных символов в переключателе может быть быстрее, а затем вызов 'toUpperCase' ... –

+0

@ValeriAtamaniouk: Вы имеете в виду дополнительные случаи? Я был слишком ленив, чтобы напечатать;) Независимо от того, как долго будет вход, это не будет узким местом приложения ... – jlordo

+0

Отлично, это тот ответ, который я искал, очень упрощен, но очень полезен :) –