декодированный файл base64 не равен исходному незашифрованному файлу - PullRequest
2 голосов
/ 24 января 2012

У меня есть обычный pdf-файл A.pdf, третье лицо кодирует файл в base64 и отправляет его мне в веб-сервисе в виде длинной строки (я не контролирую третье лицо).

Моя проблема заключается в том, что когда я декодирую строку с помощью java org.apache.commons.codec.binary.Base64 и корректирую вывод в файл с именем B.pdf Я ожидаю, что B.pdf будет идентичен A.pdf, но B.pdf оказывается немного другим, чем A.pdf. В результате B.pdf не распознается как действительный PDF-файл acrobat.

Есть ли в base64 разные типы механизмов кодирования \ кодировки? я могу определить, как полученная строка закодирована так, чтобы B.pdf = A.pdf?

РЕДАКТИРОВАТЬ - это файл, который я хочу декодировать, после декодирования он должен открыться как pdf

мой закодированный файл


это заголовок файлов, открытых в блокноте ++

**A.pdf**
        %PDF-1.4
        %±²³´
        %Created by Wnv/EP PDF Tools v6.1
        1 0 obj
        <<
        /PageMode /UseNone
        /ViewerPreferences 2 0 R
        /Type /Catalog

  **B.pdf**
        %PDF-1.4
        %±²³´
        %Created by Wnv/EP PDF Tools v6.1
        1 0! bj
        <<
        /PageMode /UseNone
        /ViewerPreferences 2 0 R
        /]
        pe /Catalog

так я декодирую строку

private static void decodeStringToFile(String encodedInputStr,
            String outputFileName) throws IOException {
        BufferedReader in = null;
        BufferedOutputStream out = null;
        try {
            in = new BufferedReader(new StringReader(encodedInputStr));
        out = new BufferedOutputStream(new FileOutputStream(outputFileName));
            decodeStream(in, out);
            out.flush();
        } finally {
            if (in != null)
                in.close();
            if (out != null)
                out.close();
        }
    }

    private static void decodeStream(BufferedReader in, OutputStream out)
            throws IOException {
        while (true) {
            String s = in.readLine();
            if (s == null)
                break;
            //System.out.println(s);
            byte[] buf = Base64.decodeBase64(s);
            out.write(buf);
        }

    }

1 Ответ

2 голосов
/ 24 января 2012
  1. Вы разбиваете свое декодирование, работая построчно. Base64 декодеры просто игнорируют пробелы, что означает, что байт в исходном содержимом вполне может быть разбит на две строки текста Base64.Вам следует объединить все строки вместе и декодировать файл за один раз.

  2. Предпочитать использовать byte[] вместо String при предоставлении содержимого для методов класса Base64.String подразумевает кодировку набора символов, которая может не выполнять то, что вы хотите.

...