關於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#
相關文章
- Apache 開啟gzip壓縮Apache
- 前端效能優化gzip初探(補充gzip壓縮使用演算法brotli壓縮的相關介紹)前端優化演算法
- 關gzip壓縮,我有新發現
- 簡單聊聊 GZIP 的壓縮原理與日常應用
- nginx指定埠開啟gzip壓縮Nginx
- Vue開啟gzip壓縮檔案Vue
- Apache開啟GZIP壓縮功能方法Apache
- vue-cli3.0配置GZIP壓縮Vue
- 高效能 gzip 壓縮工具 pgzip
- 探索HTTP傳輸中gzip壓縮的祕密HTTP
- 解析ws訂閱返回的GZIP 壓縮資料
- 如何透過ZBlogPHP啟用Gzip壓縮?PHP
- Apache開啟gzip壓縮提高網站速度Apache網站
- nginx快取配置及開啟gzip壓縮Nginx快取
- 伺服器端如何開啟GZIP壓縮功能伺服器
- VuePress 部落格優化之開啟 Gzip 壓縮Vue優化
- 修復損壞的gzip壓縮檔案之原理篇
- vue-cli 啟動gzip壓縮,及後臺配置Vue
- C# 關於壓縮、加密、解壓問題C#加密
- 從 Gzip 壓縮 SVG 說起 — 論如何減小資原始檔的大小SVG
- Nginx開啟gzip壓縮大幅提高頁面載入速度Nginx
- c語言,批次處理檔案,進行gzip壓縮C語言
- NET中SharpZipLib 的使用(一)【壓縮與解壓】
- Redshift關於列的壓縮格式
- 【親媽教學】配置Gzip壓縮,含前後端步驟後端
- Linux 常用的壓縮與解壓縮命令詳解Linux
- NET中SharpZipLib 的使用(二)【Web中壓縮與解壓】Web
- 圖解gzip壓縮檔案底層結構及檔案損壞的修復方法圖解
- .NET 壓縮/解壓檔案
- Linux tar分卷壓縮與解壓縮Linux
- 如何在Spring Boot應用程式中啟用GZIP壓縮? | 前端後端Spring Boot前端後端
- Linux中檔案的壓縮和解壓縮Linux
- 淺談在c#中使用Zlib壓縮與解壓的方法C#
- Nginx網路壓縮 CSS壓縮 圖片壓縮 JSON壓縮NginxCSSJSON
- linux 高效壓縮工具之xz的壓縮解壓使用Linux
- Linux下檔案的壓縮與解壓Linux
- ppt怎麼壓縮,ppt壓縮的技巧分享
- Nginx效能優化功能- Gzip壓縮(大幅度提高頁面載入速度)Nginx優化
- 大資料中批次壓縮與獨立壓縮的比較 - Bozho大資料