2016-05-24 2 views
0

Ich habe einen Java-Code, der dekomprimiert (zlib-Komprimierung) Bytes in der Socket-Verbindung empfangen ... das System ist in der Lage zu entpacken, wenn der Server PC 32 Bit ist und zlib.dll verwendet aber den gleichen Code löst DataFormatException aus, wenn der Server auf 64-Bit-Prozessor & OS geändert wird - und das Serversystem komprimiert zlib64.dll.zlib Dekomprimierungsfehler in Java

(Dies ist, was die Server-seitige System Company zu uns sagt)

Nach Server-Side-System - es wird überprüft, ob der Server-Prozessor & OS 32bit oder 64bit ist und dann die Datenpakete entsprechend komprimieren und sende es. Mein Code:

Inflater inflater = new Inflater(); 
       inflater.setInput(message); 
       ByteArrayOutputStream outputStream = new ByteArrayOutputStream(compHeader.MsgLen); 
       byte[] buffer = new byte[1024]; 
       while (!inflater.finished()) { 
      int count = 0; 
        try { 
         count = inflater.inflate(buffer); // ERROR LINE - THROWS DATAFORMATEXCEPTION of java.util.zip java package 
        } catch (DataFormatException ex) { 
         Logger.getLogger(BroadCastManager.class.getName()).log(Level.SEVERE, null, ex); 
        } 
       outputStream.write(buffer, 0, count); 
       } 
       try { 
        outputStream.close(); 
       } catch (IOException ex) { 
        Logger.getLogger(BroadCastManager.class.getName()).log(Level.SEVERE, null, ex); 
       } 

können Sie einen Code alternativen schaffen, die sowohl handhaben kann - 32-Bit und 64-Bit-?? oder sagen, was könnte der eigentliche Grund für dieses Problem sein?

+0

Ich glaube, der Grund ist nicht die Architektur. Aus der [zlib FAQ] (http://www.gzip.org/zlib/zlib_faq.html#faq25) 'Wird zlib an einer Big-Endian- oder Little-Endian-Architektur arbeiten, und kann ich komprimierte Daten zwischen ihnen austauschen? - Ja und Ja. Können Sie ein Dummy-Beispiel angeben (z. B. komprimiertes "Hallo Welt" oder so). – SubOptimal

+0

Update - nach der Server-Seite Team - der Fehler ist aufgrund der Unfähigkeit der Handhabung der neuen Heartbeat-Byte-Pakete ... Traurig zu sagen, dass dieses Problem noch nicht von uns gelöst ist, viel Komplikation an unserem Ende sowie an der Serverseite Team. –

+0

Sie können die Daten, die Sie erhalten, trotzdem ablegen und selbst untersuchen. Ohne weiter zu wissen, was Ihr Server-Team meint, klingt es ein bisschen komisch, dass ein Heartbeat-Paket zu Datenkorruption führen sollte. – SubOptimal

Antwort

1

Könnte es sein, dass die Daten nicht mit zlib sondern mit gzip komprimiert sind?

Nehmen Sie als Beispiel folgende

echo "hello zlib" > /tmp/in 
gzip /tmp/in 
# will result in /tmp/in.gz 

Wenn Sie versuchen, sie zu entpacken wie

byte[] buffer = new byte[10000]; 
byte[] message = Files.readAllBytes(Paths.get("/tmp/in.gz")); 
Inflater inflater = new Inflater(); 
inflater.setInput(message); 
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
System.out.println("read input as zlib"); 
try { 
    outputStream.write(buffer, 0, inflater.inflate(buffer)); 
    Files.write(Paths.get("/tmp/out.txt"), outputStream.toByteArray(), 
     StandardOpenOption.CREATE); 
} catch (DataFormatException ex) { 
    System.out.println("ex = " + ex); 
} 

... eine Ausnahme java.util.zip.DataFormatException: incorrect header check ausgelöst.

Wenn Sie es als gzip wie

byte[] buffer = new byte[10000]; 
Path gzipPath = Paths.get("/tmp/in.gz"); 
System.out.println("read input as gzip"); 
try (GZIPInputStream gzip = new GZIPInputStream(Files.newInputStream(gzipPath))){ 
    int read = gzip.read(buffer); 
    buffer = Arrays.copyOfRange(buffer, 0, read); 
    Files.write(Paths.get("/tmp/gzip.inflated"), buffer, 
     StandardOpenOption.CREATE); 
} 

dekomprimieren ... die Datei /tmp/gzip.inflated erstellt.