线程“main”中的异常 java.util.zip.DataFormatException:不正确的标头检查
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20917623/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Exception in thread "main" java.util.zip.DataFormatException: incorrect header check
提问by user3159579
I've written an application in Java for compressing and decompressing a String using Deflaor and Inflator, but when I run it I get the following exception:
我用 Java 编写了一个应用程序,用于使用 Deflaor 和 Inflator 压缩和解压缩字符串,但是当我运行它时,出现以下异常:
Deflated String:x??Q?n?0??@>"C??E????3?,[
d????9??P??????x?O?????hcy??L
?Ct??{~m?I:?$?%\HD+?I?
?NwG
Exception in thread "main" java.util.zip.DataFormatException: incorrect header check
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:223)
at java.util.zip.Inflater.inflate(Inflater.java:240)
at sample_ftp.Sample_ftp.main(Sample_ftp.java:70)
Java Result: 1
My code:
我的代码:
// Encode a String into bytes
String inputString = "Pehla nasha Pehla khumaar Naya pyaar hai naya intezaar Kar loon main kya apna haal Aye dil-e-bekaraar Mere dil-e-bekaraar Tu hi bata Pehla nasha Pehla khumaar Udta hi firoon in hawaon mein kahin Ya main jhool jaoon in ghataon mein kahin Udta hi firoon in hawaon mein kahin Ya main jhool jaoon in ghataon mein kahin Ek kar doon aasmaan zameen Kaho yaaron kya karoon kya nahin Pehla nasha Pehla khumaar Naya pyaar hai naya intezaar Kar loon main kya apna haal Aye dil-e-bekaraar Mere dil-e-bekaraar Tu hi bata Pehla nasha Pehla khumaar Usne baat ki kuchh aise dhang se Sapne de gaya vo hazaaron range ke Usne baat ki kuchh aise dhang se Sapne de gaya vo hazaaron range ke Reh jaoon jaise main haar ke Aur choome vo mujhe pyaar se Pehla nasha Pehla khumaar Naya pyaar hai naya intezaar Kar loon main kya apna haal Aye dil-e-bekaraar Mere dil-e-bekaraar";
byte[] input = inputString.getBytes("UTF-8");
// Compress the bytes
byte[] output1 = new byte[100];
Deflater compresser = new Deflater();
compresser.setInput(input);
compresser.finish();
int compressedDataLength = compresser.deflate(output1);
compresser.end();
System.out.println("Deflated String:"+new String(output1));
String str=new String(output1);
byte output2[]=str.getBytes("UTF-8");
// Decompress the bytes
Inflater decompresser = new Inflater();
decompresser.setInput(output2);
byte[] result = new byte[10000];
int resultLength = decompresser.inflate(result);
decompresser.end();
// Decode the bytes into a String
String outputString = new String(result, 0, resultLength, "UTF-8");
System.out.println("Deflated String:"+outputString);
采纳答案by PopoFibo
Couple of problems with your code here:
您的代码有几个问题:
1) Your assumption is the Byte Array output1
returned with deflator can be a valid String
without a valid encoding - evident from your code here:
1)您的假设是output1
使用 deflator 返回的字节数组在String
没有有效编码的情况下可以是有效的 - 从您的代码中可以看出:
String str=new String(output1);
byte output2[]=str.getBytes("UTF-8");
Instead, don't unnecessarily convert the bye array representation but pass it directly as is: decompresser.setInput(output1)
相反,不要不必要地转换 bye 数组表示,而是直接按原样传递它: decompresser.setInput(output1)
EDIT:Changed as per the new requirement in the comments
编辑:根据评论中的新要求进行更改
2) You are setting a blank byte array to your inflate
, which would result in a blank String too (here):
2)您正在为您的 设置一个空白字节数组inflate
,这也会导致一个空白字符串(此处):
byte[] result = new byte[10000];
int resultLength = decompresser.inflate(result);
3) You have limited your compressed buffer size to be 100; I have increased it to accommodate your entire String
3) 您已将压缩缓冲区大小限制为 100;我增加了它以容纳您的整个字符串
byte[] output1 = new byte[input.length];
You can use a byte array here derived from your String or the previous byte array
您可以在此处使用从您的 String 或前一个字节数组派生的字节数组
Edit:As pointed out in the comments, the requirement is to specifically get the byte array to/from a String, hence to represent Binary data in a String format Base64encoding scheme will come into play, modifying the code to that effect:
编辑:正如评论中所指出的,要求是专门从字符串中获取字节数组,因此以字符串格式表示二进制数据Base64编码方案将发挥作用,修改代码以实现该效果:
import org.apache.axis.encoding.Base64;
Changed code:
更改的代码:
public static void main(String[] args) {
try {
// Encode a String into bytes
String inputString = "Pehla nasha Pehla khumaar Naya pyaar hai naya intezaar Kar loon main kya apna haal Aye dil-e-bekaraar Mere dil-e-bekaraar Tu hi bata Pehla nasha Pehla khumaar Udta hi firoon in hawaon mein kahin Ya main jhool jaoon in ghataon mein kahin Udta hi firoon in hawaon mein kahin Ya main jhool jaoon in ghataon mein kahin Ek kar doon aasmaan zameen Kaho yaaron kya karoon kya nahin Pehla nasha Pehla khumaar Naya pyaar hai naya intezaar Kar loon main kya apna haal Aye dil-e-bekaraar Mere dil-e-bekaraar Tu hi bata Pehla nasha Pehla khumaar Usne baat ki kuchh aise dhang se Sapne de gaya vo hazaaron range ke Usne baat ki kuchh aise dhang se Sapne de gaya vo hazaaron range ke Reh jaoon jaise main haar ke Aur choome vo mujhe pyaar se Pehla nasha Pehla khumaar Naya pyaar hai naya intezaar Kar loon main kya apna haal Aye dil-e-bekaraar Mere dil-e-bekaraar";
byte[] input = inputString.getBytes("UTF-8");
// Compress the bytes
byte[] output1 = new byte[input.length];
Deflater compresser = new Deflater();
compresser.setInput(input);
compresser.finish();
int compressedDataLength = compresser.deflate(output1);
compresser.end();
String str = Base64.encode(output1);
System.out.println("Deflated String:" + str);
byte[] output2 = Base64.decode(str);
// Decompress the bytes
Inflater decompresser = new Inflater();
decompresser.setInput(output2);
byte[] result = str.getBytes();
int resultLength = decompresser.inflate(result);
decompresser.end();
// Decode the bytes into a String
String outputString = new String(result, 0, resultLength, "UTF-8");
System.out.println("Deflated String:" + outputString);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DataFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Output:
输出:
Deflated String:eJzNUbtuwzAM/BX+QD4iQ6eiRdDH0PESM6YsWwpku4X99Tna7lC03QK0g42TeOQdTwe1FpLQG+Sw4GhjBxR5xAS5TA4NgRQeQxp09pt7fm3OSTqEJJElXBJIRCv7SaUK7U53R40oTn/Q8u3uZRQLcsTwKfyTideKZdLOobgatQwfcF11XRj/b1hdNJZzKw02Ym0c/ZV522l3kaBI5Qygp98kMzrVxHgsi0eX13DIyxtMS+/vG/+P2Puk5GCQGCSOJzNB6DnLkGoheKYujyq1+3vPtDCv6xYyVKLeZMaT2vYEzdK7rG3ukMX9WOTEV+rUm7uxMd2CI/PPAr4Cer8r5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Deflated String:Pehla nasha Pehla khumaar Naya pyaar hai naya intezaar Kar loon main kya apna haal Aye dil-e-bekaraar Mere dil-e-bekaraar Tu hi bata Pehla nasha Pehla khumaar Udta hi firoon in hawaon mein kahin Ya main jhool jaoon in ghataon mein kahin Udta hi firoon in hawaon mein kahin Ya main jhool jaoon in ghataon mein kahin Ek kar doon aasmaan zameen Kaho yaaron kya karoon kya nahin Pehla nasha Pehla khumaar Naya pyaar hai naya intezaar Kar loon main kya apna haal Aye dil-e-bekaraar Mere dil-e-bekaraar Tu hi bata Pehla nasha Pehla khumaar Usne baat ki kuchh aise dhang se Sapne de gaya vo hazaaron range ke Usne baat ki kuchh aise dhang se Sapne de gaya vo hazaaron range ke Reh jaoon jaise main haar ke Aur choome vo mujhe pyaar se Pehla nasha Pehla khumaar Naya pyaar hai naya intezaar Kar loon main kya apna haal Aye dil-e-bekaraar Mere dil-e-bekaraar
.....
.....