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 结果中出现的八个不同字节值被替换由我的 3F(“?”)。这些值及其 ISO-8859-1 字符名称为 A4('currency')、A6('broken bar')、A8('diaeresis')、B4('acute accent')、B8('cedilla')、BC (“粗俗分数 1/4”)、BD(“粗俗分数 1/2”)和 BE(“粗俗分数 3/4”)。

我猜 StringUtils.newString 函数没有将这八个值转换为字符串输出,因为我尝试了其他 8 位字符集:UTF-8 和 cp437。他们的结果相似但更糟,有更多的 3F,“?” 换人。

有什么建议么?我应该为 newString 函数使用什么字符集来转换 .zip 字符串?Apache 功能是否无法进行这种翻译?有没有更好的方法来做这个解码?

谢谢!

4

1 回答 1

4

zip 文件不是字符串。它不是编码文本。它可能包含文本文件,但这不是一回事。这只是二进制数据。

如果将任意二进制数据视为字符串,就会发生不好的事情。相反,您应该使用流或字节数组。所以这很好:

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

...但不要尝试将其转换为字符串。如果您将其写入byte[]文件(可能使用FileOutputStream或某些实用程序方法)应该没问题。

于 2013-03-25T14:33:16.443 回答