包含zip文件的base64字符串的解码在结果字符串中得到8个字符代码错误

时间:2013-03-25 14:30:23

标签: java character-encoding zip base64 decode

我从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)进行了比较,发现它们与8个不同字节值的异常相同,它们出现在b64dec.exe结果中,被我的3F(“?”)取代。值及其ISO-8859-1字符名称为A4('货币'),A6('断条'),A8('diaeresis'),B4('急性重音'),B8('cedilla'),BC ('粗俗分数1/4'),BD('粗俗分数1/2')和BE('粗俗分数3/4')。

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

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

谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

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

...但尝试将其转换为字符串。如果你将byte[]写到文件中(可能带有FileOutputStream或某种实用方法),那应该没问题。