這段經過Base64編碼的字串,經過解碼與解壓之后,會得到一串xml格式的檔案。
對這一串字符再進行壓縮與編碼,得到的最終長度與原字串長度卻不一致。
在解壓操作時,如果必須在setInput方法中設定offset 32,否則會提示如下錯誤
java.util.zip.DataFormatException: incorrect header check
在再次壓縮的程序中,卻不知道如何設定offset,壓縮的字串長度比未解壓的字串長度少了32位元組。
并且使用這種方法壓縮后的資料是無法再解壓的。
困擾很久的問題,非常期待得到幫助。
package test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Base64;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
public class Test2 {
public static void main(String[] args) {
try {
String encodedText = "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";
Base64.Decoder decoder = Base64.getDecoder();
//解碼字串,回傳位元組陣列
byte[] output = decoder.decode(encodedText);
//得到位元組陣列長度 3172
int output_length = output.length;
ByteArrayOutputStream xmlout = new ByteArrayOutputStream (10000);
//解壓
Inflater decompress = new Inflater();
decompress.setInput(output, 32, output_length-32);
boolean b1 = decompress.needsDictionary();
boolean b2 = decompress.needsInput();
int a1 = decompress.getTotalIn();
int a2 = decompress.getTotalOut();
do {
byte[] result = new byte[1000];
int ab = decompress.getAdler();
int resultLength = decompress.inflate(result);
xmlout.write(result, 0, resultLength);
} while (!decompress.finished());
int finalsize = (int)decompress.getBytesWritten();
//得到解壓縮后的字串:<?xml version="1.0" encoding="UTF-16" ?><Adobe_Root><Adobe_Title><Version>20。。。。。</Adobe_Root>
String finalStr = new String(xmlout.toByteArray(),0,finalsize, "unicode");
//再次執行壓縮操作
byte[] input = finalStr.getBytes("unicode");
byte[] input_result = new byte[100000];
Deflater compresser = new Deflater();
//compresser.setInput(input);
compresser.setInput(input, 0, input.length);
compresser.finish();
//得到壓縮的字串長度:3140,比未解壓縮之前少了32位元組
int compressedDataLength = compresser.deflate(input_result);
byte[] contentByte = new byte[compressedDataLength];
System.arraycopy(output, 0, contentByte, 0, compressedDataLength);
String s2 = new String(contentByte);
//編碼
Base64.Encoder encoder = Base64.getEncoder();
byte[] result2 = encoder.encode(contentByte);
String a = new String(contentByte);
System.out.println(a.length());
System.out.println(new String(result2));
System.out.println(new String(result2));
//new String(xmlout.toByteArray(),0,)
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
uj5u.com熱心網友回復:
//解壓Inflater decompress = new Inflater(true);
uj5u.com熱心網友回復:
測驗過,不行。必須要得到原來的壓縮字串
uj5u.com熱心網友回復:
有沒有好的辦法嗎?uj5u.com熱心網友回復:
試試看一下面的程式
public class Test2 {
public static void main(String[] args) {
try {
String encodedText = "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";
Base64.Decoder decoder = Base64.getDecoder();
//解碼字串,回傳位元組陣列
byte[] output = decoder.decode(encodedText);
for (int i = 0; i < output.length; ++i) {
if (output[i] < 0) {
output[i] += 256;
}
}
//得到位元組陣列長度 3172
int output_length = output.length;
ByteArrayOutputStream xmlout = new ByteArrayOutputStream (10000);
//解壓
Inflater decompress = new Inflater();
decompress.setInput(output, 32, output_length-32);
boolean b1 = decompress.needsDictionary();
boolean b2 = decompress.needsInput();
int a1 = decompress.getTotalIn();
int a2 = decompress.getTotalOut();
do {
byte[] result = new byte[1000];
int ab = decompress.getAdler();
int resultLength = decompress.inflate(result);
xmlout.write(result, 0, resultLength);
} while (!decompress.finished());
int finalsize = (int)decompress.getBytesWritten();
//得到解壓縮后的字串:<?xml version="1.0" encoding="UTF-16" ?><Adobe_Root><Adobe_Title><Version>20。。。。。</Adobe_Root>
String finalStr = new String(xmlout.toByteArray(),0,finalsize, "unicode");
//再次執行壓縮操作
byte[] input = finalStr.getBytes("unicode");
byte[] input_result = new byte[100000];
Deflater compresser = new Deflater();
//compresser.setInput(input);
compresser.setInput(input, 0, input.length);
compresser.finish();
//得到壓縮的字串長度:3140,比未解壓縮之前少了32位元組
int compressedDataLength = compresser.deflate(input_result);
byte[] contentByte = new byte[compressedDataLength];
System.arraycopy(output, 0, contentByte, 0, compressedDataLength);
String s2 = new String(contentByte);
//編碼
Base64.Encoder encoder = Base64.getEncoder();
byte[] result2 = encoder.encode(contentByte);
String a = new String(contentByte);
System.out.println(a.length());
System.out.println(new String(result2));
System.out.println(new String(result2));
//new String(xmlout.toByteArray(),0,)
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
uj5u.com熱心網友回復:
上面有誤,setInput(output, 0, compressedDataLength);
compressedDataLength是壓縮前的源檔案長度,你壓縮前的源檔案長度未知,所以獲取的長度可能和源檔案長度不一致。
uj5u.com熱心網友回復:
int finalsize = (int)decompress.getBytesWritten(); //這是壓縮前的源檔案長度
經過除錯我發現代碼中一處參考錯誤:
System.arraycopy(output, 0, contentByte, 0, compressedDataLength);
應該改成
System.arraycopy(input_result, 0, contentByte, 0, compressedDataLength);
uj5u.com熱心網友回復:
有一處很不理解,第30行代碼,為什么會設定32 bit的偏移:decompress.setInput(output, 32, output_length-32);
如果在解壓縮的時候設定了偏移,我覺得在重新壓縮的時候,同樣需要設定,但我嘗試設定該值,得到的都是錯誤結果。
uj5u.com熱心網友回復:
inflate 原始碼
inflate(byte[] b, int off, int len)
你程式里
decompress.setInput(output, 32, output_length-32);
設定了偏移量為32,長度也減少32。那么你前后2段長度肯定也會相差32.
uj5u.com熱心網友回復:
decompress.setInput(output, 32, output_length-32);
這一行代碼來源于這里的最后一篇回復:
https://community.adobe.com/t5/premiere-pro/how-to-export-a-legacy-title-in-new-premiere-pro-cc-update/td-p/9057131
不知道為何要加32byte的偏移,但我嘗試不加偏移,但在執行解壓縮的時候,執行到這一行代碼
int resultLength = decompress.inflate(result);
就會報如下錯誤:
java.util.zip.DataFormatException: incorrect header check
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Unknown Source)
at java.util.zip.Inflater.inflate(Unknown Source)
at test.Test2.main(Test2.java:39)
uj5u.com熱心網友回復:
確實如果不加32會報錯,但是api原始碼實體是不用加32的,應該跟之前壓縮有關系,下面的api的案例代碼。
所以你的代碼確實可以解壓該字串,但是你再次壓縮時沒有包含這32位元組,所以肯定會少。
try {
// Encode a String into bytes
String inputString = "blahblahblah??";
byte[] input = inputString.getBytes("UTF-8");
// Compress the bytes
byte[] output = new byte[100];
Deflater compresser = new Deflater();
compresser.setInput(input);
compresser.finish();
int compressedDataLength = compresser.deflate(output);
// Decompress the bytes
Inflater decompresser = new Inflater();
decompresser.setInput(output, 0, compressedDataLength);
byte[] result = new byte[100];
int resultLength = decompresser.inflate(result);
decompresser.end();
// Decode the bytes into a String
String outputString = new String(result, 0, resultLength, "UTF-8");
} catch(java.io.UnsupportedEncodingException ex) {
// handle
} catch (java.util.zip.DataFormatException ex) {
// handle
}
uj5u.com熱心網友回復:
這是PR檔案中要決議的字串來源,屬性中顯示是Encoding是base64
另外還有一個BinaryHash屬性,這是做什么用的?去除-號,它是一個32位的字串,不知道有什么用
<ImporterPrefs Encoding="base64" BinaryHash="e0e26420-8a70-fce7-7ca9-ea5d00000c6e">AQAAAAAAAADAYQAAAAAAAENvbXByZXNzZWRUaXRsZQB4nO1daVMbPRLWT3Ht9+AjnFWzvEU4NqklIYV5E/iUMsaAdx3ba5sE9sfvbvfT0uicsYEkHjYuymD1pZbU3eqRRuK//8nUH+pefVUDVVPfVE9N1FT11UgN1V/VX1RTrakG/a0RZqi6BL8i7FDdAPunOlNH6hVRbYLmD7WrMrVHNCN1SRxf1Cl9G6lZBD8jKTOqswfMJ6/eXdWiOhtqmz5b9GkRRT2iydR7SJbyF9Um/Axl1m4Kio9UQ0c9EPaIqCbqO5UmpMUu0U3UHXGw5GKqjKTOUJoR1tTTpXIP/bGrrgk7oNpE0jxq1miS98uAfnapfaJDCM/UIcmaAvoO3EIZQpluSNpyjdf0U65hOS3rNyLaWVLDGOPqeEL9OUtoaeAMnT9i9RIr4fZOoW8f+Ik6xriNUMOU7O9Tof0yv0sdlg/RHz2SPkM91wRPyWtpWS79GUkZQ0fT9hRO9Gfv6Uaj4mJYrz71R4e47zA204g+RZGpt+hJlnMAfB+9EvIWUYnc8h4Je40lfIXtmD4q67OxOicreke/D0lKm2BNePk26o6xzHFB39+pDwQT+h3EBqH3cUzdVvtknYf084Hs6BQcQhtjMmr7hHT8Tu24RUsmurUmwhj8KfrpFu3l8hAy53GH/Rn3Vdibe/AGsW4um3FtEw2PhPWGPdTWAZbL19rz1nR7LSyj3yNqv4s1kAx1ScsEvwO8C81IlxH0GpH2LpUPl+hXpqfB7jm9VNyOhtoobYnBl7VlY8HWbMxpT5HG9YVG7w3RdNU/tb3cwfdSXrKuvaRNunaIhvGnaH0PdfLsy3FknbTe0T4zjzaj6BvPASfa9sYE5VhgIvAplfkvcw4xE34Fn9tK8aZiPsanWsyYA2jYIciAeHmufMhje3FLtyAz3bp6qUwfd0ale/hhL59Fxp6//hgd5tfzN4J1CHaLiH9C9vIPHTt8SWI/PfTfPjjsbDJV/yKqDnRhHdJUGUkeYZQMbJ8kj2AJPCZ2fFhGOW0s6wS/h3PlWDr2csb01Gf6e4XYuZt7eozJyAL78KUJ5jwpGY40LqOYLDPcG8L9m76Lp4VeUESVOa3ZhxcMgTsimgFsS0bmNVnFGmlS+0HfJFYtUnNGtjKAVY0xNr9ay8VrZ+rHWbvxnn1ENh6hFJUbnczc0cmfTEweFkIl+t/DS4bQi+fv0C7SNGxVIzwVfNbt8Z8hYmwG7+E4yL10rK17SvlNWGMxXZGMiwVlXOjnrgHmwKHOP9hLzLwqGXeMz/Akc4mMnecXN7J+1m2V+beIKoNPjiG7C988A20b80c3H5UmnvVY1mL0RXJt1HPbNo82w9PaIOpPAzX9YKzZL4V2KLbz4YVbp8v5NNucL2FlmT/XMtOWeJmPRjVsNJyRV1b6u1lpkT1Oda1DXcvLs8/VHP//YaOhJdYXzFHLnwPTq5VmDaCct5Z4EhVueVY1MqT9bfzuaq/q07NOD88Fm3pELIz74V69pe92xcSOXIwT+r9DD7s+7cPYI2Ul2PRhG08CZqVH/LGYYnHP53rb+gmYR2ArXyHy4SFlaoUkRWH4BogbM6+9LlTo/sRTHPeCtZ24jhSV8LtPwf4Y+M/HwicxIY4XLi4jbJ+ednnt/irX3ocJzTt4gPiTS+fDhfYaNj+g+N1BZNl11u/3ECcvQf8KNnsDal61MDJjfiN3hP48ApyfKh+SddS8WqzUMm6/BjeeFekYU/oybKzZjLjcOHQNLTtYtbhBhH1QvJrB3riNva4d7KUZGTGtxJ/Ys+tzYsYiNGa12bQyLNfIAg4SkcZSvNGeXBbbZnl/bMCurW3bfhpj3amfa3aAVVm25k6+8mZ2AeZT2lUnWYvgqGHmwJTHpOgy7H1JKyX6+muDMTaDbNaAV/4ZP8KMc+74VBG+iPdiDu+F1lRWhTmv+UKlEWKpZAuyJmQifzldhvGYADPUnj+DFZq+T2MfF5UOabwuEf0HaMttnqG09cx0Co+MI+hjOHln06xay2p5B1mD9U6xXRNF5lGb3V7f7hl+BNu5yXU51iOU8okN7RMhjz9Xx/O07N5yjXYe8mGZkjX5gSPBhWSYxWVHN+xXF5NB+0NEjZ6era7yfQe2nFh3X9rj+XnNO4SGe6xlFOw9Pu4EfRNqVkSVIeMT/3qr50YeuZC/iEr6nteGZojfJgJv0nhzrN/ORyOmKarb3el5p/vxHjGoRTFonT6bFIla+W7W46S4e0GMe0/f75F58Jrvz/vt7ya5NTMmZRnP85TmAr7yinpz45f6i7sOUSVvcfValq9svRhfaZA9P+fzeF+IoWaukazM6l82BzUL951rwSz4gazhq37zxn2vYxpx7gYZhotJ71s/TYPXS9dgfekabCxdg82la7C1dA22l67BztI1aOZv2i1Th2YFdFh+ZGxWIDY2KxAdm6XxsYV1F1mH2EFu8Ct0elVqo6FOG7/MdxuV8F/Wogo+3MCb59XQowq+zHpUwZ8bePezGnosP/MRPZaf/zT1iY1q6FGNXKga+VCjIjlRoyJ5UaMiuVGjIvlRY06O9BQ9fLi7KuGumofladSGGFK2s9TVGjA+/b58miJD3/Cam5ym8VuexmU4CzfAvsuJt8+2rmtKY/0+lp1ld50txmZYg+x7+xp2JTOFczlknc7fKSjC8nsSss8hZ73OlJytMDvpaWzI9Ua55yhaSV6fxkrYi/YsUpgM9stnFQfYeZG9d3dXsBhv69onq+sm63Ix8q51BztivDfkWm9Dj3QR3tYVrsfG8AzvUYvFmH3dmurn645s52Y2YTu8cmSZnbQbfJc37c1IW4i8/Xfn9ZIpZ1QDrz1OcpwtcynWbTGNmy9O49aL0/j1i9N4PdC4hafdYq0tvkhzS/Fc7W1sjGNRGudGIxuDwzjkRmcLTZ0bDDnTZwst/iPe4Yh3x1MULl/cvjTObx/PTmM9A4UttLiQh3vNf3+rGO/yyjnX28SeW5rG5X2POVROpbkzbJpC5mWxrdQbYSE2zHGen6ek16Iel7G4b6Ss8pZV3lLNvKWFvdeyeG/wxfG+lZ9CXuUwqxxmlcOscphVDlO9HGbjCTnM01ZdzJz2c7OXVe7yu+cuP2dm4pXxrVXO8qI0fvk5y7I1XuUpqzzlqXmKD/FPXLp3ovmwVEZj9s6fvqLiw805M4M3b9bEEkJKyW54jjJnmtwTLHZ9pogiw7jKHY4z+JxPGZ/MKKfmd7PvkDGIhgPtGaGcIiqX37y7HVpImoItpIs6eurcaWFT20cK5/OkaH2aixK5FwVyL5K0YgP9vBa3fS7cUoW3D7jwTMlZKj6rHbc9jfN52gS/dLCNiDOkCG34HCcEBxiRdEbuU7j1x/2axvk883SOKUKdL+bqfBHo7GPtmZeY076JzxqNEXnauQW47YxxYT17OdU3siI+Kf1QUGua0s3cU/gwh0/L8DPoMz3Xhp5dRBW2KX2GOqbgsxPckzLvTXUuMFP2nsY0lnF+JE/BJOIfUyS5QRwTGr8sd9nZOcOWuXSAfvuOdybsfXYpqKk5BbP3AkheZkp8x+tIjXXEfUjORubNpafcRfExj942d2GrfY07M9fwFkRTZ2eMY0vYwjmbNZyKkVnOnDJOSXMzK/EVlsnc5lSblWxPrRuJLveip/qrcP/Lc+4U+V1u2KiX2LnvBcJrsjP+7r8flIIVcYu/mfEqunu2pviuAHPrnDnD3gRmnHNMlZy58ym4HnO6129XHxZSdqqXb2uwJ4O3sWuxhjUyE+3vvZPD59rnUh5rcfNP9n7LNZRZyPRTaLPFdJnXY8dJXy2jYHxZrzHFIdaHBjrKMJ97N6C1LXtHEEtdlOupN+KckozjqKcMlG3uFP45ydv6VskJ9BHBxX5DigxZyxC9xBC+u0PaIf5+pe17Ag+V9/SKbpNdjLKma+Ss/g5tM086NSe6SL7u3+dQy62gCHue3+4i7TOrZIIzt4QX0RiriO96CSnr2o5+XN/NMFe794AM9XdbW0xTj+KMD/Vn+3oyM7BPvzI33ClzF40t19RN/j2MQGP0QZdqOqMPz1rx+dqYIoPfdXTMtllmCM08H+K6+T8BdPTqjo2Vpo+szlIubl09yK/qUf71Kb/r+0g/A8V7BWWnVq81V+hx9UIM99h+ntfu6v8uEEINnViZ/xTvYxhSrLvgbSv9O6MFwqeLy+6139XxKvVfFf4HGP1CBg==
</ImporterPrefs>
uj5u.com熱心網友回復:
binaryhash 應該是二值哈希編碼,應該是檢索圖片檔案用的,被追加在base64編碼之前了。
uj5u.com熱心網友回復:
樓主,你的代碼的第30行,為啥要舍棄32個位元組?然后,在60行的注釋里面說,少了32個位元組,是因為沒有看到第30行舍棄了32個位元組吧?
位元組數應該是不會有差異的,并且,每個位元組里面的資料也是要一一對應相等的。
uj5u.com熱心網友回復:
樓主,你的代碼的第30行,為啥要舍棄32個位元組?
然后,在60行的注釋里面說,少了32個位元組,是因為沒有看到第30行舍棄了32個位元組吧?
位元組數應該是不會有差異的,并且,每個位元組里面的資料也是要一一對應相等的。
這是別人寫的代碼,偏移了32個位元組,我嘗試過不進行偏移,但在進行解壓縮的時候會報錯:
java.util.zip.DataFormatException: incorrect header check
uj5u.com熱心網友回復:
樓主,你的代碼的第30行,為啥要舍棄32個位元組?
然后,在60行的注釋里面說,少了32個位元組,是因為沒有看到第30行舍棄了32個位元組吧?
位元組數應該是不會有差異的,并且,每個位元組里面的資料也是要一一對應相等的。
這是別人寫的代碼,偏移了32個位元組,我嘗試過不進行偏移,但在進行解壓縮的時候會報錯:
java.util.zip.DataFormatException: incorrect header check
這32個字符是圖片引索用的,字串可能是圖片的壓縮碼,所以正常內容就是33位元組開始的內容,但是你壓縮的時候沒有添加上去,自然少32字符。
uj5u.com熱心網友回復:
樓主,你的代碼的第30行,為啥要舍棄32個位元組?
然后,在60行的注釋里面說,少了32個位元組,是因為沒有看到第30行舍棄了32個位元組吧?
位元組數應該是不會有差異的,并且,每個位元組里面的資料也是要一一對應相等的。
這是別人寫的代碼,偏移了32個位元組,我嘗試過不進行偏移,但在進行解壓縮的時候會報錯:
java.util.zip.DataFormatException: incorrect header check
這32個字符是圖片引索用的,字串可能是圖片的壓縮碼,所以正常內容就是33位元組開始的內容,但是你壓縮的時候沒有添加上去,自然少32字符。
那32個字符是BinaryHash嗎?e0e26420-8a70-fce7-7ca9-ea5d00000c6e
怎么把它添加進去?是把它轉字byte陣列,添加到壓縮后的byte陣列前嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/34329.html
標籤:Web 開發
上一篇:bean創建失敗原因?
