2016-07-12 20 views
0

Base64文字列があります。私はそれをデコードしようとしています。私は解凍のために使用していますBase64文字列を変換できません。適切に解凍しません。

String textToDecode = "H4sIAAAAAAAAAAEgAN//0JTQtdGC0LDQu9C40LfQuNGA0L7QstCw0L3QvdGL0LmRCuyiIAAAAA==\n"; 
byte[] data = Base64.decode(textToDecode, Base64.DEFAULT); 
String result = GzipUtil.decompress(data); 

コード:

public static String decompress(byte[] compressed) throws IOException { 
    final int BUFFER_SIZE = 32; 
    ByteArrayInputStream is = new ByteArrayInputStream(compressed); 
    GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE); 
    StringBuilder string = new StringBuilder(); 
    byte[] data = new byte[BUFFER_SIZE]; 
    int bytesRead; 
    while ((bytesRead = gis.read(data)) != -1) { 
     string.append(new String(data, 0, bytesRead)); 
    } 
    gis.close(); 
    is.close(); 
    return string.toString(); 
} 

が、私はこの文字列を取得する必要があります、それの

Детализированный 

Insteamを、私は疑問符記号で、この文字列を取得しています:

Детализирован��ый 

tは私の間違いですか?そしてそれを解決する方法は?

答えて

0

1つの問題は、バイトから文字列に変換するとき(内部的にUnicode) エンコーディングが指定されていないことです。また、UTF-8のようなマルチバイトエンコーディングの場合、固定されたバイト数(32のような)を取ることができず、最後に有効なシーケンスがあります。

明らかにハーフシーケンスが失われました。したがって、エンコーディングはおそらくUTF-8です。

final int BUFFER_SIZE = 32; 
ByteArrayInputStream is = new ByteArrayInputStream(compressed); 
GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
byte[] data = new byte[BUFFER_SIZE]; 
int bytesRead; 
while ((bytesRead = gis.read(data)) != -1) { 
    baos.write(data, 0, bytesRead); 
} 
gis.close(); 
return baos.toString("UTF-8"); // Or "Windows-1251" ... 

上記はバッファ境界の問題を解決し、エンコードを指定するため、同じコードが異なるコンピュータで実行されます。

と心:

  • new String(bytes, encoding)
  • string.getBytes(encoding)
0

問題がここにあることも可能である:あなたはJavaのStringにバイトをデコードするためにデフォルトの文字エンコーディングを使用している

string.append(new String(data, 0, bytesRead)) 

。 (現在の)デフォルトのエンコーディングが元の文字をバイトにエンコードするとき(圧縮前など)に使用されるエンコーディングと異なる場合、正しくデコードされないバイトを取得できます。デコーダはそれをデコーダの置換文字で置き換えます。すなわち、デフォルトでは'\uFFFD'です。

これが問題になる場合は、正しい文字エンコーディングが何であるかを調べ、Stringを作成するためにString(byte[], int, int, Charset)を使用します。

+0

「UTF-8」でエンコードされていることがわかりました。あなたの提案に続いて、私はこの 'string.append(new String(data、0、bytesRead、" UTF-8 "));を試しました。 –

+0

圧縮/ base64の前と、base64 /減圧後のバイトのバイトごとの比較を行うことをお勧めします。そして長さ。また、改行がそこにあるかどうか自問してください。 –

0

あなたはエンコーディングの問題を回避することができますストリームでのみ動作している場合は、このコードのいくつかの行は、ジョブウェルを行う必要があります

public static String decompress(byte[] compressed) throws IOException { 
     try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { 
      try (GZIPInputStream gis = new GZIPInputStream(
        new ByteArrayInputStream(compressed))) { 
       org.apache.commons.compress.utils.IOUtils.copy(gis, bos); 
      } 
      return bos.toString(); 
     } 
    } 
関連する問題