在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數(shù)據(jù)壓縮算法的介紹

汽車電子技術 ? 來源:Java爛筆頭 ? 作者:小週 ? 2023-02-28 14:25 ? 次閱讀

1 前言

在RPC通信數(shù)據(jù)的傳輸場景下,當通信報文數(shù)據(jù)傳輸較大時,會對數(shù)據(jù)包進行壓縮傳輸,根據(jù)不同傳輸場景,常用的壓縮算法有Zlib、Gzip、Bzip2、Deflater、Lz4、Lzo、Snappy算法等。以下將包括算法的介紹、Java實現(xiàn)代碼以及各算法間的模擬性能對比。

2 壓縮方案

  • Zlib

bzip2是Julian Seward開發(fā)并按照自由軟件/開源軟件協(xié)議發(fā)布的數(shù)據(jù)壓縮算法及程序。對于壓縮和解壓縮,沒有數(shù)據(jù)長度的限制,bzip2比傳統(tǒng)的gzip的壓縮效率更高,但是它的壓縮速度較慢。

核心代碼:

 @Override
public byte[] compress(byte[] data) throws IOException {
byte[] output;

Deflater compresser = new Deflater();

compresser.reset();
compresser.setInput(data);
compresser.finish();
ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);
try {
byte[] buf = new byte[1024];
while (!compresser.finished()) {
int i = compresser.deflate(buf);
bos.write(buf, 0, i);
}
output = bos.toByteArray();
} catch (Exception e) {
output = data;
e.printStackTrace();
} finally {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
compresser.end();
return output;
}

@Override
public byte[] uncompress(byte[] data) throws IOException {
byte[] output;

Inflater decompresser = new Inflater();
decompresser.reset();
decompresser.setInput(data);

ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);
try {
byte[] buf = new byte[1024];
while (!decompresser.finished()) {
int i = decompresser.inflate(buf);
o.write(buf, 0, i);
}
output = o.toByteArray();
} catch (Exception e) {
output = data;
e.printStackTrace();
} finally {
try {
o.close();
} catch (IOException e) {
e.printStackTrace();
}
}

decompresser.end();
return output;
}

測試結果:

圖片

  • Gzip

gzip的實現(xiàn)算法還是deflate,只是在deflate格式上增加了文件頭和文件尾,同樣jdk也對gzip提供了支持,分別是GZIPOutputStream和GZIPInputStream類,同樣可以發(fā)現(xiàn)GZIPOutputStream是繼承于DeflaterOutputStream的,GZIPInputStream繼承于InflaterInputStream,并且可以在源碼中發(fā)現(xiàn)writeHeader和writeTrailer方法。

核心代碼:

@Override
public byte[] compress(byte[] data) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip;

try {
gzip = new GZIPOutputStream(out);
gzip.write(data);
gzip.close();
} catch (IOException e) {
e.printStackTrace();
}

return out.toByteArray();
}

@Override
public byte[] uncompress(byte[] data) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(data);

try {
GZIPInputStream ungzip = new GZIPInputStream(in);
byte[] buffer = new byte[2048];
int n;
while ((n = ungzip.read(buffer)) >= 0) {
out.write(buffer, 0, n);
}
} catch (IOException e) {
e.printStackTrace();
}

return out.toByteArray();
}

測試結果:

圖片

  • Bzip2

bzip2是Julian Seward開發(fā)并按照自由軟件/開源軟件協(xié)議發(fā)布的數(shù)據(jù)壓縮算法及程序。Seward在1996年7月第一次公開發(fā)布了bzip2 0.15版,在隨后幾年中這個壓縮工具穩(wěn)定性得到改善并且日漸流行,Seward在2000年晚些時候發(fā)布了1.0版。bzip2比傳統(tǒng)的gzip的壓縮效率更高,但是它的壓縮速度較慢。

核心代碼:

@Override
  public byte[] compress(byte[] data) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    BZip2CompressorOutputStream bcos = new BZip2CompressorOutputStream(out);
    bcos.write(data);
    bcos.close();


    return out.toByteArray();
  }


  @Override
  public byte[] uncompress(byte[] data) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ByteArrayInputStream in = new ByteArrayInputStream(data);


    try {
      @SuppressWarnings("resource")
      BZip2CompressorInputStream ungzip = new BZip2CompressorInputStream(in);
      byte[] buffer = new byte[2048];
      int n;
      while ((n = ungzip.read(buffer)) >= 0) {
        out.write(buffer, 0, n);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }


    return out.toByteArray();
  }

測試結果:

圖片

  • Deflater

DEFLATE是同時使用了LZ77算法與哈夫曼編碼(Huffman Coding)的一個無損數(shù)據(jù)壓縮算法,DEFLATE壓縮與解壓的源代碼可以在自由、通用的壓縮庫zlib上找到,zlib官網:http://www.zlib.net/ jdk中對zlib壓縮庫提供了支持,壓縮類Deflater和解壓類Inflater,Deflater和Inflater都提供了native方法。

核心代碼:

@Override
public byte[] compress(byte[] data) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Deflater compressor = new Deflater(1);

try {
compressor.setInput(data);
compressor.finish();
final byte[] buf = new byte[2048];
while (!compressor.finished()) {
int count = compressor.deflate(buf);
bos.write(buf, 0, count);
}
} finally {
compressor.end();
}

return bos.toByteArray();
}

@Override
public byte[] uncompress(byte[] data) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Inflater decompressor = new Inflater();

try {
decompressor.setInput(data);
final byte[] buf = new byte[2048];
while (!decompressor.finished()) {
int count = decompressor.inflate(buf);
bos.write(buf, 0, count);
}
} catch (DataFormatException e) {
e.printStackTrace();
} finally {
decompressor.end();
}

return bos.toByteArray();
}

測試結果:

圖片

  • Lz4

LZ4是一種無損數(shù)據(jù)壓縮算法,著重于壓縮和解壓縮速度。

核心代碼:

@Override
public byte[] compress(byte[] data) throws IOException {
LZ4Factory factory = LZ4Factory.fastestInstance();
ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
LZ4Compressor compressor = factory.fastCompressor();
LZ4BlockOutputStream compressedOutput = new LZ4BlockOutputStream(byteOutput, 2048, compressor);
compressedOutput.write(data);
compressedOutput.close();

return byteOutput.toByteArray();
}

@Override
public byte[] uncompress(byte[] data) throws IOException {
LZ4Factory factory = LZ4Factory.fastestInstance();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
LZ4FastDecompressor decompresser = factory.fastDecompressor();
LZ4BlockInputStream lzis = new LZ4BlockInputStream(new ByteArrayInputStream(data), decompresser);

int count;
byte[] buffer = new byte[2048];
while ((count = lzis.read(buffer)) != -1) {
baos.write(buffer, 0, count);
}
lzis.close();

return baos.toByteArray();
}

測試結果:

圖片

  • Lzo

LZO是致力于解壓速度的一種數(shù)據(jù)壓縮算法,LZO是Lempel-Ziv-Oberhumer的縮寫,這個算法是無損算法。

核心代碼:

@Override
public byte[] compress(byte[] data) throws IOException {
LzoCompressor compressor = LzoLibrary.getInstance().newCompressor(LzoAlgorithm.LZO1X, null);
ByteArrayOutputStream os = new ByteArrayOutputStream();
LzoOutputStream cs = new LzoOutputStream(os, compressor);
cs.write(data);
cs.close();

return os.toByteArray();
}

@Override
public byte[] uncompress(byte[] data) throws IOException {
LzoDecompressor decompressor = LzoLibrary.getInstance().newDecompressor(LzoAlgorithm.LZO1X, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayInputStream is = new ByteArrayInputStream(data);
@SuppressWarnings("resource")
LzoInputStream us = new LzoInputStream(is, decompressor);

int count;
byte[] buffer = new byte[2048];
while ((count = us.read(buffer)) != -1) {
baos.write(buffer, 0, count);
}

return baos.toByteArray();
}

測試結果:

圖片

  • Snappy

Snappy(以前稱Zippy)是Google基于LZ77的思路用C++語言編寫的快速數(shù)據(jù)壓縮與解壓程序庫,并在2011年開源。它的目標并非最大壓縮率或與其他壓縮程序庫的兼容性,而是非常高的速度和合理的壓縮率。

核心代碼:

@Override
public byte[] compress(byte[] data) throws IOException {
return Snappy.compress(data);
}

@Override
public byte[] uncompress(byte[] data) throws IOException {
return Snappy.uncompress(data);
}

測試結果:

圖片

3 性能對比

ENV:JDK:11/CPU:4C/

圖片

不同大小文件壓縮效率及質量有差異,性能對比僅供參考;

Compress Rate(%) = Size Before(byte) / Size After(byte) * 100%

源碼地址

上傳至Gitee倉庫:

https://gitee.com/javanoteany/compress.git
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 通信數(shù)據(jù)

    關注

    0

    文章

    13

    瀏覽量

    10038
  • RPC
    RPC
    +關注

    關注

    0

    文章

    111

    瀏覽量

    11809
  • 數(shù)據(jù)包

    關注

    0

    文章

    269

    瀏覽量

    24891
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    FPGA實現(xiàn)滑動平均濾波算法和LZW壓縮算法

    采集數(shù)據(jù)中的量化噪聲,在進行數(shù)據(jù)壓縮前采用濾波的預處理技術。介紹LZW算法和滑動濾波算法的基本理論,詳細闡述用單片F(xiàn)PGA實現(xiàn)兩種
    發(fā)表于 04-24 09:05

    【TL6748 DSP申請】井下數(shù)據(jù)壓縮技術

    申請理由:我是中石油渤海鉆探工程公司定向井分公司的儀器工程師,目前我在研發(fā)一項科研項目,主要是關于數(shù)據(jù)壓縮算法以及數(shù)據(jù)編解碼方面技術研究。需要利用數(shù)據(jù)處理芯片來實現(xiàn)井下
    發(fā)表于 09-10 11:09

    請問有沒有32可用的數(shù)據(jù)壓縮算法

    了40M大小,手賤用rar壓縮了一下,3.2M!!!,為了傳輸這40M的數(shù)據(jù)更改了工具的波特率和buffer,這樣就和公司老產品不兼容了,如果STM32上能實現(xiàn)類似rar的數(shù)據(jù)壓縮算法
    發(fā)表于 12-19 08:57

    數(shù)據(jù)壓縮技術

    一、數(shù)據(jù)壓縮的必要性二、多媒體數(shù)據(jù)壓縮的可能性三、壓縮方案應滿足的要求四、編碼方案分類五、數(shù)據(jù)壓縮(編碼)的主要步驟六、一些基本的壓縮技術七
    發(fā)表于 03-25 13:19 ?35次下載

    GPS定位數(shù)據(jù)壓縮算法的設計與實現(xiàn)

    為了解決嵌入式GPS車載系統(tǒng)中存儲空間小!GPS定位數(shù)據(jù)量大的矛盾" 根據(jù)GPS定位數(shù)據(jù)的特點"提出了專用于GPS定位數(shù)據(jù)壓縮的改進型半字節(jié)壓縮算法
    發(fā)表于 07-22 15:54 ?16次下載

    GPS定位數(shù)據(jù)壓縮算法的設計與實現(xiàn)

    摘要:為了解決嵌入式GPS車載系統(tǒng)存儲空間小、GPS定位數(shù)據(jù)量大的矛盾,根據(jù)GPS定位數(shù)據(jù)的特點,提出了專用于GPS定全數(shù)據(jù)壓縮的改進型半字節(jié)壓縮
    發(fā)表于 03-11 13:38 ?941次閱讀
    GPS定位<b class='flag-5'>數(shù)據(jù)壓縮</b><b class='flag-5'>算法</b>的設計與實現(xiàn)

    基于矢量量化編碼的數(shù)據(jù)壓縮算法的研究與實現(xiàn)

    基于矢量量化編碼的數(shù)據(jù)壓縮算法的研究與實現(xiàn) As the rapid development of communications and information technology, data
    發(fā)表于 06-16 08:32 ?1877次閱讀

    基于實時數(shù)據(jù)庫的數(shù)據(jù)壓縮算法

    本內容提出了基于實時數(shù)據(jù)庫的數(shù)據(jù)壓縮算法,希望對大家學習上有所幫助
    發(fā)表于 05-26 16:07 ?20次下載
    基于實時<b class='flag-5'>數(shù)據(jù)</b>庫的<b class='flag-5'>數(shù)據(jù)壓縮</b><b class='flag-5'>算法</b>

    小波算法在監(jiān)測數(shù)據(jù)壓縮中的應用

    小波算法在監(jiān)測數(shù)據(jù)壓縮中的應用
    發(fā)表于 02-07 18:22 ?16次下載

    基于DCT的陣列聲波測井數(shù)據(jù)壓縮算法_林博

    基于DCT的陣列聲波測井數(shù)據(jù)壓縮算法_林博
    發(fā)表于 03-19 19:07 ?1次下載

    使用遺傳算法對時空數(shù)據(jù)壓縮策略優(yōu)化

    針對時空數(shù)據(jù)因為有損壓縮導致的還原精度不高的問題,提出了使用遺傳算法對時空數(shù)據(jù)壓縮策略進行優(yōu)化。算法模擬生物進化過程,首先,在初始階段,根據(jù)
    發(fā)表于 12-05 14:18 ?0次下載
    使用遺傳<b class='flag-5'>算法</b>對時空<b class='flag-5'>數(shù)據(jù)壓縮</b>策略優(yōu)化

    基于運動狀態(tài)改變的GPS軌跡數(shù)據(jù)壓縮算法

    針對基于偏移量計算的軌跡數(shù)據(jù)壓縮算法中對于關鍵點的評估不足以及基于在線軌跡數(shù)據(jù)壓縮算法中累積誤差和對偏移量考慮不足的問題,提出一種基于運動狀態(tài)改變的在線全球定位系統(tǒng)( GPS)軌跡
    發(fā)表于 12-26 18:55 ?1次下載

    數(shù)據(jù)壓縮的重要性

    數(shù)據(jù)壓縮是指在不丟失有用信息的前提下,縮減數(shù)據(jù)量以減少存儲空間,提高其傳輸、存儲和處理效率,或按照一定的算法數(shù)據(jù)進行重新組織,減少數(shù)據(jù)的冗
    的頭像 發(fā)表于 02-28 10:45 ?1.5w次閱讀

    數(shù)據(jù)壓縮算法計算步驟及過程

    一種非常簡單的壓縮方法是行程長度編碼,這種方法使用數(shù)據(jù)數(shù)據(jù)長度這樣簡單的編碼代替同樣的連續(xù)數(shù)據(jù),這是無損數(shù)據(jù)壓縮的一個實例。這種方法經常用
    的頭像 發(fā)表于 02-28 10:51 ?1.2w次閱讀
    <b class='flag-5'>數(shù)據(jù)壓縮</b><b class='flag-5'>算法</b>計算步驟及過程

    有趣!史記:數(shù)據(jù)壓縮算法列傳

    簡單地說,如果沒有數(shù)據(jù)壓縮技術,我們就沒法用 WinRAR 為 Email 中的附件瘦身;如果沒有數(shù)據(jù)壓縮技術,市場上的數(shù)碼錄音筆就只能記錄不到20 分鐘的語音;如果沒有數(shù)據(jù)壓縮技術
    的頭像 發(fā)表于 11-11 15:21 ?1043次閱讀
    主站蜘蛛池模板: 在线毛片免费 | 久久婷婷综合中文字幕 | 欧美人与物另类 | 在线黄色免费观看 | 亚洲成a人片7777 | 日韩免费高清一级毛片在线 | 萝l在线精品社区资源 | 色之综合网 | 天天爱天天做色综合 | 欧美怡红院免费全视频 | 欧美在线视频看看 | 欧美黄色高清 | 婷婷亚洲综合 | 天堂资源最新版在线官网 | 亚洲精品卡1卡二卡3卡四卡 | 中国同志chinese小彬tv | 亚洲第二页| 国产成人精品日本 | 色多多网 | 久久99免费| 国产美女主播一级成人毛片 | 色综合激情丁香七月色综合 | 深爱激情五月婷婷 | 婷婷色在线播放 | 玖玖在线国产精品 | 老司机精品视频免费 | 天天摸天天碰色综合网 | 夜夜摸视频网 | 亚洲卡1卡2卡新区网站 | 国产资源在线播放 | 男女艹逼软件 | 午夜视频在线观看免费视频 | 成年女人在线观看 | 午夜性爽视频男人的天堂在线 | 午夜黄色剧场 | 亚洲国内精品久久 | 在线观看黄日本高清视频 | 五月天婷婷免费视频观看 | 激情五月婷婷基地 | 中文字幕第11页 | 亚洲欧美日本视频 |