ошибка при преобразовании строки base64 в десятичную - PullRequest
0 голосов
/ 05 мая 2019

Приведенный ниже метод преобразует десятичную строку в BASE64 строку:

public static String id2base64String(String mediaId) {
    String postId = "";
    try {
        long id = Long.parseLong(mediaId);
        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";

        while (id > 0) {
            long remainder = (id % 64);
            id = (id - remainder) / 64;
            postId = alphabet.charAt((int) remainder) + postId;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println(String.format("input is %s, output is %s", mediaId, postId));
    return postId;
}

И я написал метод для обращения функции, чтобы она могла принять строку BASE64 в десятичную форму:

public static String base64StringToId(String base64String) {
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
    long id = 0L;
    for (int i = 0; i < base64String.length(); i++) {
        char c = base64String.charAt(i);
        int i1 = alphabet.indexOf(c);
        id += i1 * Math.pow(64, base64String.length() - 1 - i);
        //converted[string.length() - i - 1] = i1;
    }
    System.out.println(String.format("input is %s, output is %s", base64String, String.valueOf(id)));
    return String.valueOf(id);
}

При использовании следующего кода для запуска:

    String base64String = "ybyPRoQWzX";
    String id = "908540701891980503";
    id2base64String(id);
    base64StringToId(base64String);

Показывает вывод как:

input is 908540701891980503, output is ybyPRoQWzX
input is ybyPRoQWzX, output is 908540701891980544

Как видите, выход второго метода не такой, как ожидалось (ожидается, что он будет 908540701891980503, но я получил 908540701891980544).

Есть идеи?

1 Ответ

1 голос
/ 05 мая 2019

Существует небольшая ошибка в операциях с плавающей точкой с большими числами.Я думаю, что писать таким образом становится более последовательным.

public static String base64StringToId(String base64String) {
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
    long id = 0L;
    for (int i = 0; i < base64String.length(); i++) {
        char c = base64String.charAt(i);
        int i1 = alphabet.indexOf(c);
        id = (id * 64) + i1;
        //id += i1 * Math.pow(64, base64String.length() - 1 - i);
        //converted[string.length() - i - 1] = i1;
    }
    System.out.println(String.format("input is %s, output is %s", base64String, String.valueOf(id)));
    return String.valueOf(id);
}
...