2017-11-13 2 views
0

먼저 gzip으로 압축 한 다음 base64로 인코딩 한 문자열이 있습니다. 일반 텍스트를 다시 갖고 싶습니다. 다시 입력/출력 팽창/여기서 Base64에서 문자열 디코드 및 압축 해제

압축 및베이스 64 부호화 된 데이터이다 수축

I 추측
java.util.zip.ZipException: invalid stored block lengths 
     at java.util.zip.InflaterOutputStream.write(InflaterOutputStream.java:273) 
     at java.io.FilterOutputStream.write(FilterOutputStream.java:97) 
     at de.martinm.tools.EBICS.DSTools.decode_decompress(DSTools.java:87) 
     at de.martinm.tools.EBICS.DSTools.process(DSTools.java:77) 
     at de.martinm.tools.EBICS.DSTools.main(DSTools.java:100) 

, I가 혼합있어 : 다음 코드

private void decode_decompress(String string) { 
    byte[] decodedBytes = Base64.decodeBase64(string.getBytes()); 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    Inflater decompresser = new Inflater(true); 
    InflaterOutputStream inflaterOutputStream = new InflaterOutputStream(stream, decompresser); 
    try { 
     inflaterOutputStream.write(decodedBytes); 
     inflaterOutputStream.close(); 
     byte[] output2 = stream.toByteArray();   
     logger.info("Data: {}", output2.toString()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

예외가 발생 :

eJx1U2tzqjAQ/SsO96NTw1PBQTr4qlgtyqvVL3cihEehiSYg1l9/rd46dZx + y549Ocme3dUfDx9FY48oywjucUKL5xoIhyTKcNLjfG/8oHINVkIcwY Jg1OMw4R4N3c0SDMuKokW1eUafNo0QHcISNk5qmPW4tCy3XQDqum6hTRayFqEJcHle4C6MbnRLqqUzQ +는 R5HvAaOHEiliV /은 vtlnjR5XUdw90S5hd8Lz8jfhwLJf9ATwNp + 5YYo + 4EOGvyoJ0ekWy7rsDM5ICMtz7b/+ uXH/Ljgf/7JvG1oHFnF3tlg4JoZ + OQewqJChR6zruOZNPCdRVVTMMOebJcxHZRJ1kqeDJJqfR6IQJDdngt1cBt5ncYKnO8d99Tp9gYoweT2O40BUatURhWKZvVHV7E8102XHXTDN5ZI1vZyX6KKeSm + SmK9VlQZ5nZeKvd8X7aPUmRztxdp8rtaZom1kJlsRqsK95RSS7RJ7AYOQbg6S2vZXrjWA6S5vqzlWYCG/z947YgXjcOasFuF8/JKs34nngCGYIVBukJd9jLHftuQSmfV6LJFg2CQrU5Ze4qJYpR1/b5qD2MaOvSv27Z1PV4GA + p1U1IDFWLJaifGEKmGKxZ3lq5Ox0EHb1G ++ JvGIpaSayxYd9J2kfO7nhXiw4XYYD3fyJsbC8kmDVv2iJZqqaAtnn/d08MPkL8NHh + 1plHFpmEtzcM5ekXN00yBw075rg4PLxhgmz7d1cAf/gG5GAdISI2oNjVHfGried5K/QrrPfqYUHfwH7sSu62b8A39iR + Y =

+1

압축이 잘못되었을 수 있습니다. 그 코드를 보여줘. 여기에 크로스 플랫폼 명확성 (코드 검사기) :'string.getBytes (StandardCharsets.US_ASCII)'및'new String (output2, StandardCharsets.UTF_8)'또는 압축시 사용되는 항목이 있습니다. –

+0

'Base64.decodeBase64 (string.getBytes()); 대신에 내부적으로 ISO-8859-1 charset을 사용하는'Base64.decodeBase64 (string); '을 사용할 수 있습니다. 또한 'Inflater (boolean)'에 JavaDoc을 적어 두십시오 : 'nowrap'옵션을 사용하는 경우 추가 "더미"바이트를 입력으로 제공해야합니다. " - 따라서 여러분은'decodedBytes'에 바이트를 prepend해야 할 수도 있습니다. 그러나, "gzip이 아님"이라고 명시 했으므로 GZIP 호환 압축 풀기를 비활성화하여 false를 전달하거나 인수가없는 생성자를 사용하려고합니다. – Thomas

+0

압축은 순수 zip 압축이어야합니다. 데이터가 적용되는 표준에서 요청한대로 –

답변

1

이 해결 문제 :

private void decode_decompress(String string) { 
    byte[] decodedBytes = Base64.decodeBase64(string); 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    Inflater decompresser = new Inflater(false); 
    InflaterOutputStream inflaterOutputStream = new InflaterOutputStream(stream, decompresser); 
    try { 
     inflaterOutputStream.write(decodedBytes); 
     inflaterOutputStream.close(); 
     String data = stream.toString(); 
     logger.info("Data: {}", data); 
    } catch (IOException e) { 
     logger.error(string, e); 
    } 
} 
관련 문제