關於Java的GZIP壓縮與.net C#的GZIP壓縮的差異
今天在做一個java專案的時候,需要獲取.net壓縮後的xml,進行解壓縮展示。
試了很多次,居然發現java gzip無法解壓縮.net壓縮後的密文,真是奇恥大辱,經過多倫分析,發現.net GZIP壓縮和java GZIP壓縮存在差異。
主要的差異在於,.net GZIP在前後4個位元組都寫入了長度,而java GZIP只在尾部追加長度,就這麼一點點差別浪費了大半天時間,不多說上程式碼。
首先是java壓縮:
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String str="hello world";
byte[ ] bytes=str.getBytes();
System.out.println("壓縮前長度:"+bytes.length);
byte[ ] gzipBytes=gzip(bytes);
System.out.println("壓縮後長度:"+gzipBytes.length);
System.out.println("壓縮後:"+byteToHexString(gzipBytes));
byte[ ] unGzipBytes=unGzip(gzipBytes);
System.out.println("解壓後:"+byteToHexString(unGzipBytes));
}
結果顯示:
壓縮前長度:11
壓縮後長度:31
壓縮後:1F8B0800000000000000CB48CDC9C95728CF2FCA49010085114A0D0B000000
解壓後:68656C6C6F20776F726C64
上面的1F8B0800000000000000是10個位元組的固定GZIP格式,最後8個位元組表示壓縮前的資料長度。
.net gzip
class Program
{
static void Main(string[] args)
{
//要壓縮的字串
string data = "hello world";
byte[] buffer = System.Text.UTF8Encoding.UTF8.GetBytes(data);
//壓縮後的byte陣列
byte[] compressedbuffer = null;
//Compress buffer,壓縮快取
MemoryStream ms = new MemoryStream();
using (GZipStream zs = new GZipStream(ms, CompressionMode.Compress, true))
{
zs.Write(buffer, 0, buffer.Length);
}
//只有GZipStream在Dispose後調應對應MemoryStream.ToArray()所得到的Buffer才是我們需要的結果
compressedbuffer = ms.ToArray();
//將壓縮後的byte陣列basse64字串
string hex = BitConverter.ToString(compressedbuffer);
Console.WriteLine(hex);
}
}
壓縮後:0B0000001F8B0800000000000000CB48CDC9C95728CF2FCA49010085114A0D0B000000
可以清楚的看到.net壓縮後,前後4個位元組是一樣的,都是長度。
那java端怎麼讀取呢,很簡單,去掉那4個位元組即可
byte[] src = Base64Util.decode(str_base);
byte[] result = new byte[src.length-4];
System.arraycopy( src, 4, result, 0, result.length );
反過來c#端如果解析java端GZIP的呢,這個不用說了吧,加上4個位元組。
感謝拍馬屁的部落格指引 :http://blog.csdn.net/qq_18870023/article/details/52189300#
相關文章
- Java和.NET的GZIP壓縮功能對比Java
- Apache 開啟gzip壓縮Apache
- 使用gzip壓縮檔案
- 前端效能優化gzip初探(補充gzip壓縮使用演算法brotli壓縮的相關介紹)前端優化演算法
- linux下gzip的壓縮詳解Linux
- 關gzip壓縮,我有新發現
- Java實現檔案壓縮與解壓[zip格式,gzip格式]Java
- 給Tomcat,Apache配置gzip壓縮(HTTP壓縮)功能 (轉)TomcatApacheHTTP
- 簡單聊聊 GZIP 的壓縮原理與日常應用
- 使用filter實現網站的gzip壓縮Filter網站
- Vue開啟gzip壓縮檔案Vue
- Apache開啟GZIP壓縮功能方法Apache
- vue-cli3.0配置GZIP壓縮Vue
- 高效能 gzip 壓縮工具 pgzip
- 探索HTTP傳輸中gzip壓縮的祕密HTTP
- 解析ws訂閱返回的GZIP 壓縮資料
- 過濾器實現檔案的gzip壓縮過濾器
- Nginx的gzip壓縮的原理和設定引數Nginx
- Android總結之Gzip/Zip壓縮Android
- 分析核心對gzip壓縮檔案進行解壓的方法(轉)
- android解壓縮GZIP格式的網頁資料Android網頁
- C#實現通過Gzip來對資料進行壓縮和解壓C#
- nginx快取配置及開啟gzip壓縮Nginx快取
- Apache開啟gzip壓縮提高網站速度Apache網站
- 伺服器端如何開啟GZIP壓縮功能伺服器
- VuePress 部落格優化之開啟 Gzip 壓縮Vue優化
- Node.js伺服器啟用Gzip壓縮Node.js伺服器
- 修復損壞的gzip壓縮檔案之原理篇
- 啟用 Brotli 壓縮演算法,對比 Gzip 壓縮 CDN 流量再減少 20%演算法
- Android Java壓縮Zlib,Gzip,Zip支援J2MEAndroidJava
- vue-cli 啟動gzip壓縮,及後臺配置Vue
- 檢視網頁是否壓縮gzip+編碼方式網頁
- 使用CLR函式壓縮(Gzip)ntext型別欄位函式型別
- gzip的介紹以及web伺服器對檔案壓縮的支援Web伺服器
- C# 關於壓縮、加密、解壓問題C#加密
- JAVA壓縮和解壓縮Java
- aix 檔案的壓縮與解壓縮AI
- Nginx開啟gzip壓縮大幅提高頁面載入速度Nginx