Декодирование Base64 на C# или Java

У меня есть объект в кодировке Base64 со следующим заголовком:

application/x-xfdl;content-encoding="asc-gzip"

Каков наилучший способ приступить к декодированию объекта? Нужно ли удалять первую строку? Кроме того, если я превращу его в массив байтов (byte[]), как мне распаковать его?

Спасибо!


Думаю, я изначально оговорился. Сказав, что заголовок был

application/x-xfdl;content-encoding="asc-gzip"

Я имел в виду, что это была первая строка файла. Итак, чтобы использовать библиотеки Java или C# для декодирования файла, нужно ли удалять эту строку?

Если да, то какой самый простой способ убрать первую строку?


person Jason    schedule 16.12.2009    source источник


Ответы (6)


Мне удалось использовать следующий код для преобразования документа .xfdl в документ Java DOM.

Я использовал утилиту Base64 iHarder для декодирования Base64.

private static final String FILE_HEADER_BLOCK = 
        "application/vnd.xfdl;content-encoding=\"base64-gzip\"";  

    public static Document OpenXFDL(String inputFile) 
            throws IOException, 
                ParserConfigurationException,
                SAXException

    {
        try{

            //create file object
            File f = new File(inputFile);
            if(!f.exists()) {
                throw new IOException("Specified File could not be found!");
            }

            //open file stream from file
            FileInputStream fis = new FileInputStream(inputFile);

            //Skip past the MIME header
            fis.skip(FILE_HEADER_BLOCK.length());   

            //Decompress from base 64                   
            Base64.InputStream bis = new Base64.InputStream(fis, 
                    Base64.DECODE);

            //UnZIP the resulting stream
            GZIPInputStream gis = new GZIPInputStream(bis);

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(gis);

            gis.close();
            bis.close();
            fis.close();

            return doc;
        }
        catch (ParserConfigurationException pce) {
            throw new ParserConfigurationException("Error parsing XFDL from file.");
        }
        catch (SAXException saxe) {
            throw new SAXException("Error parsing XFDL into XML Document.");
        }
    }

Все еще работаю над успешным изменением и перекодированием документа.

Надеюсь это поможет.

person MrWizard54    schedule 11.11.2010

Чтобы декодировать содержимое Base64 в C#, вы можете использовать статические методы Convert Class.

byte[] bytes = Convert.FromBase64String(base64Data);

Вы также можете использовать класс GZipStream, чтобы помочь иметь дело с потоком GZipped.

Другой вариант — SharpZipLib. Это позволит вам извлечь исходные данные из сжатых данных.

person scptre    schedule 16.12.2009

В Java вы можете использовать Apache Commons Base64. класс

String decodedString = new String(Base64.decodeBase64(encodedBytes));
person Spike Williams    schedule 16.12.2009

Похоже, вы имеете дело с данными, которые закодированы как gzip, так и Base 64. После того, как вы удалите все заголовки mime, вы должны преобразовать данные Base64 в массив байтов, используя что-то вроде кодека Apache commons. Затем вы можете обернуть byte[] в ByteArrayInputStream и передать его в GZipInputStream, который позволит вам читать несжатые данные.

person Jherico    schedule 16.12.2009

Для java вы пробовали встроенный в java пакет java.util.zip? Кроме того, Apache Commons имеет библиотеку Commons Compress для работы с zip, tar и другими типами сжатых файлов. Что касается декодирования Base 64, существует несколько библиотек с открытым исходным кодом, или вы можете использовать класс sun.misc.BASE64Decoder от Sun.

person user12786    schedule 16.12.2009

Скопировано из другого места, для Base64 я ссылаюсь на commons-codec-1.6.jar:

public static String decode(String input) throws Exception {
    byte[] bytes = Base64.decodeBase64(input);
    BufferedReader in = new BufferedReader(new InputStreamReader(
            new GZIPInputStream(new ByteArrayInputStream(bytes))));
    StringBuffer buffer = new StringBuffer();
    char[] charBuffer = new char[1024]; 
    while(in.read(charBuffer) != -1) {
        buffer.append(charBuffer);
    }
    return buffer.toString();
}
person Alex    schedule 24.01.2012