Pessoal, eu estou tentando fazer um encode da base 64 para hexa, mas o que acontece é que alguns valores estão saindo diferente do que deveriam… isso se da ao tentar passar a variavel double para long, ela automaticamente arredonda o número, ficando diferente por 1 ou 2 valores… como impeço isso? Segue código:
public static String numberToBase64Hexa(String numero) throws PortalException {
// char 0 = 52 (base 64)
// char 1 = 53 (base 64)
// …
// char 9 = 61 (base 64)if(numero == null || "".equals(numero)) return "0"; final double ZERO_BASE64 = 52d; double valorBase64 = 0d; int tamanho = numero.length();
try { // multiplica cada digito pelo correspondente a base // ex.: 310 = (55 x 64^2) + (53 * 64^1) + (52 * 64^0) = 228724 // pois 3 = 55, 1 = 53, 0 = 52 for (int i = 0; i != tamanho; i++) { char caracter = numero.charAt(i); double digito = Double.parseDouble(Character.toString(caracter)); double posicaoDigito = ((tamanho - 1) - i); double potencia64 = Math.pow(64d, posicaoDigito);
valorBase64 += ((ZERO_BASE64 + digito) * potencia64); } } catch (NumberFormatException e) { throw new PortalException("O valor não pode ser encriptado - valor: " + numero); }
return hexa((long) valorBase64);
}
private static String hexa(long valor){
StringBuilder sb = new StringBuilder();char[] hexa = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; long resto;
if (valor != 0) { // adiciona o 'resto' ao início da String de retorno while (valor > 0) { resto = valor % 16; int r = ((int) resto); valor = valor / 16; sb.insert(0, hexa[r]); } } return sb.toString().toUpperCase();
}