1

SOAP リクエストから base64 でエンコードされた zip ファイル (文字列形式) を受け取りました。
スタンドアロン プログラム b64dec.exe を使用して文字列を正常にデコードできますが、Java ルーチンで実行する必要があります。私はApache commons-codec-1.7.jarルーチンでそれをデコードしようとしています( theZipString ):

import org.apache.commons.codec.binary.Base64;  
import org.apache.commons.codec.binary.StringUtils;
StringUtils.newString(Base64.decodeBase64(theZipString), "ISO-8859-1");        

Zip ファイル リーダーは結果のファイルを開き、コンテンツ ファイルのリストを表示しますが、コンテンツ ファイルには CRC エラーがあります。

Java ルーチンの結果と b64dec.exe プログラムの結果 (UltraEdit を使用) を比較したところ、b64dec.exe の結果に現れる 8 つの異なるバイト値が置き換えられることを除いて、それらは同一であることがわかりました。私の3F( "?")によって。値とその ISO-8859-1 文字名は、A4 (「通貨」)、A6 (「破線」)、A8 (「ダイエレシス」)、B4 (「急性アクセント」)、B8 (「セディラ」)、BC です。 (「下品画分 1/4」)、BD (「下品画分 1/2」)、および BE (「下品画分 3/4」)。

他の 8 ビット文字セット (UTF-8 と cp437) を試したため、StringUtils.newString 関数はこれらの 8 つの値を文字列出力に変換していないと推測しています。彼らの結果は似ていますが、より悪いです。代替品。

助言がありますか?.zip 文字列を変換する newString 関数には、どの文字セットを使用すればよいですか? Apache 機能はこの変換を行うことができませんか? このデコードを行うためのより良い方法はありますか?

ありがとう!

4

1 に答える 1

4

zip ファイルは文字列ではありません。エンコードされたテキストではありません。テキストファイルが含まれている場合がありますが、それは同じではありません。ただのバイナリデータです。

任意のバイナリ データを文字列として扱うと、悪いこと起こります。代わりに、ストリームまたはバイト配列を使用する必要があります。だからこれは大丈夫です:

byte[] zipData = Base64.decodeBase64(theZipString);

...しかし、それを文字列に変換しようとしないでください。それをファイルに書き出す場合byte[](おそらくFileOutputStreamまたは何らかのユーティリティメソッドを使用して)、問題ないはずです。

于 2013-03-25T14:33:16.443 に答える