我从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功能是否无法进行此转换?有没有更好的解码方法?
谢谢!
答案 0 :(得分:4)
一个zip文件不是一个字符串。它是不是编码的文本。它可能包含文本文件,但这不是一回事。这只是二进制数据。
如果将任意二进制数据视为字符串,则会发生 的错误。相反,您应该使用流或字节数组。所以这很好:
byte[] zipData = Base64.decodeBase64(theZipString);
...但不尝试将其转换为字符串。如果你将byte[]
写到文件中(可能带有FileOutputStream
或某种实用方法),那应该没问题。