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

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

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

3天內不再提示

數據壓縮算法的介紹

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

1 前言

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

2 壓縮方案

  • Zlib

bzip2是Julian Seward開發并按照自由軟件/開源軟件協議發布的數據壓縮算法及程序。對于壓縮和解壓縮,沒有數據長度的限制,bzip2比傳統的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的實現算法還是deflate,只是在deflate格式上增加了文件頭和文件尾,同樣jdk也對gzip提供了支持,分別是GZIPOutputStream和GZIPInputStream類,同樣可以發現GZIPOutputStream是繼承于DeflaterOutputStream的,GZIPInputStream繼承于InflaterInputStream,并且可以在源碼中發現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開發并按照自由軟件/開源軟件協議發布的數據壓縮算法及程序。Seward在1996年7月第一次公開發布了bzip2 0.15版,在隨后幾年中這個壓縮工具穩定性得到改善并且日漸流行,Seward在2000年晚些時候發布了1.0版。bzip2比傳統的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)的一個無損數據壓縮算法,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是一種無損數據壓縮算法,著重于壓縮和解壓縮速度。

核心代碼:

@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是致力于解壓速度的一種數據壓縮算法,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++語言編寫的快速數據壓縮與解壓程序庫,并在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
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 通信數據
    +關注

    關注

    0

    文章

    13

    瀏覽量

    10025
  • RPC
    RPC
    +關注

    關注

    0

    文章

    111

    瀏覽量

    11706
  • 數據包
    +關注

    關注

    0

    文章

    269

    瀏覽量

    24791
收藏 人收藏

    評論

    相關推薦

    FPGA實現滑動平均濾波算法和LZW壓縮算法

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

    【TL6748 DSP申請】井下數據壓縮技術

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

    請問有沒有32可用的數據壓縮算法

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

    數據壓縮技術

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

    GPS定位數據壓縮算法的設計與實現

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

    GPS定位數據壓縮算法的設計與實現

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

    基于矢量量化編碼的數據壓縮算法的研究與實現

    基于矢量量化編碼的數據壓縮算法的研究與實現 As the rapid development of communications and information technology, data
    發表于 06-16 08:32 ?1838次閱讀

    基于實時數據庫的數據壓縮算法

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

    小波算法在監測數據壓縮中的應用

    小波算法在監測數據壓縮中的應用
    發表于 02-07 18:22 ?16次下載

    基于DCT的陣列聲波測井數據壓縮算法_林博

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

    使用遺傳算法對時空數據壓縮策略優化

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

    基于運動狀態改變的GPS軌跡數據壓縮算法

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

    數據壓縮的重要性

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

    數據壓縮算法計算步驟及過程

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

    有趣!史記:數據壓縮算法列傳

    簡單地說,如果沒有數據壓縮技術,我們就沒法用 WinRAR 為 Email 中的附件瘦身;如果沒有數據壓縮技術,市場上的數碼錄音筆就只能記錄不到20 分鐘的語音;如果沒有數據壓縮技術
    的頭像 發表于 11-11 15:21 ?931次閱讀
    主站蜘蛛池模板: 成人欧美一区二区三区小说 | 成人网在线看 | 夜夜夜爽爽爽久久久 | 拍拍拍拍拍拍拍无挡大全免费 | 丁香在线视频 | 国产午夜大片 | 欧美aaaav免费大片 | 国产91丝袜在线播放九色 | 一本高清在线视频 | 免费大片a一级一级 | 五月桃花网婷婷亚洲综合 | 欧美影欧美影院免费观看视频 | 欧美人与牲动交xxxx | 老汉影视永久免费视频 | 日本三人交xxx69视频 | 999影院成 人在线影院 | 欧美1819| 久草男人天堂 | 人人操天天射 | 久久美女精品 | tube69xxxxhd日本 | 日本xxxx色视频在线观看免费 | 中国毛茸茸bbxx | 伊人不卡久久大香线蕉综合影院 | 在线天堂bt种子 | 一级毛片一片毛 | 国产成人啪精品午夜在线播放 | 色花堂国产精品首页第一页 | 久久亚洲综合色 | 酒色网址 | 成年人色网站 | 中韩日欧美电影免费看 | 国产精品久久久久国产精品三级 | 黑色丝袜美美女被躁视频 | 在线黄色大片 | 毛片在线播放网址 | 天天舔天天射天天干 | 综合网视频 | 欧美大全 | 日本一区二区高清免费不卡 | 97视频碰碰车 |