2016-05-24 18 views
0

ソケット接続で受け取ったバイトを圧縮解除するjavaコードがあります...サーバPCが32ビットで、zlib.dllを使用していても同じコードが使用されていると解凍できますサーバーが64ビットプロセッサー& OSに変更されたときにDataFormatExceptionがスローされ、サーバーシステムはzlib64.dllを使用して圧縮します。サーバー側のシステムによるとJavaのzlib圧縮解除エラー

(これは、サーバー側のシステム会社が私たちに言っていることである)

- それはサーバーのプロセッサ& OSが32ビットか64ビットであるかどうかを確認し、それに応じてデータパケットを圧縮しますそれを送ってください。 マイコード:

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); 
       } 

あなたは両方を扱うことができるコードの代替提供できます - 32ビットおよび64ビットの??何がこの問題の実際の理由であると言えるでしょうか?

+0

私はその理由がアーキテクチャではないと信じています。 [zlib FAQ](http://www.gzip.org/zlib/zlib_faq.html#faq25) 'zlibはビッグエンディアンまたはリトルエンディアンアーキテクチャで動作し、それらの間で圧縮データを交換できますか? - はい、はい.'ダミーデータの例(圧縮された「hello world」など)を提供できますか? – SubOptimal

+0

更新 - サーバー側のチームによれば、エラーは新しいハートビートバイトパケットを処理できないためです...悲しいことに、この問題はまだ私たちによって解決されていません。サーバーサイドチーム。 –

+0

あなたは受け取ったデータをダンプして自分で調べることができます。サーバーチームが何を意味するのかをさらに知ることなく、ハートビートパッケージがデータ破損につながるというのはちょっと奇妙に聞こえます。 – SubOptimal

答えて

1

データがzlibではなくgzipで圧縮されている可能性はありますか?

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

例として、次のように乗り、あなたが

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); 
} 

のようにそれを解凍しようとすると...例外java.util.zip.DataFormatException: incorrect header checkがスローされます。

あなたは

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); 
} 

などのgzipのようにそれを解凍したら...ファイル/tmp/gzip.inflatedが作成されます。

関連する問題