Gzip原始碼分析(四)
哈弗曼編碼
首先說明一下涉及到的資料結構:
typedef struct ct_data {
union {
ush freq; /* frequency count */
ush code; /* bit string */
} fc;
union {
ush dad; /* father node in Huffman tree */
ush len; /* length of bit string */
} dl;
} ct_data;
(ush是
哈弗曼編碼的輸入
在gzip中,哈弗曼編碼可看作是LZ77的下一級壓縮,但哈弗曼編碼並不直接處理LZ77輸出的第一手材料,而是做了一步對映。
dyn_dtree對應d_buf,其資料的取值範圍在0到32K之間,gzip將這32K的範圍對映到
dyn_ltree對應l_buf。l_buf中literal和length是混雜的,且兩者的取值範圍都是0到255,完全重疊在一起,如果直接哈弗曼編碼,解壓時,除非參照flag_buf,否則無法區分。之前第二篇計算最小匹配長度時,曾假設(距離-長度)二元組在上下文中能自說明,不需要額外的描述符(如flag_buf)。為了讓假設成真,gzip將length對映到[257, 285]這29個節點(用256表示block結束),所以解壓時,值大於
那麼這個對映是怎麼做的呢?這樣多對一的對映,解壓時又該怎麼還原呢?
對映的方法就是將原數值的後幾位位元(稱為extra bit)截斷,這樣就對映到了比較小的值了。解壓時,先解碼對映後的小數值,被截斷的位元緊隨其後,直接拷貝就行了,具體要拷貝多少位元視小數值而定:
int extra_dbits[30] /* extra bits for each distance code */
= {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
這是距離extra bit長度的定義;
int extra_lbits[29] /* extra bits for each length code */
= {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
這是長度extra bit長度的定義。
相關推薦
Gzip原始碼分析(四)
哈弗曼編碼 首先說明一下涉及到的資料結構: typedef struct ct_data { union { ush freq; /* frequency count */ ush code; /* bi
Flume NG原始碼分析(四)使用ExecSource從本地日誌檔案中收集日誌
常見的日誌收集方式有兩種,一種是經由本地日誌檔案做媒介,非同步地傳送到遠端日誌倉庫,一種是基於RPC方式的同步日誌收集,直接傳送到遠端日誌倉庫。這篇講講Flume NG如何從本地日誌檔案中收集日誌。 ExecSource是用來執行本地shell命令,並把本地日誌檔案中的資料封裝成Event
OpenCV學習筆記(30)KAZE 演算法原理與原始碼分析(四)KAZE特徵的效能分析與比較
KAZE系列筆記: 1. OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2. OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構
GCC原始碼分析(四)——優化
原文連結:http://blog.csdn.net/sonicling/article/details/7916931 一、前言 本篇只介紹一下框架,就不具體介紹每個步驟了。 二、Pass框架 上一篇已經講了gcc的中間語言的表現形式。gcc 對中間語言
YOLOv2原始碼分析(四)
文章全部YOLOv2原始碼分析 0x01 backward_convolutional_layer void backward_convolutional_layer(convolutional_layer l, network
AFNetWorking(3.0)原始碼分析(四)——AFHTTPSessionManager(2)
在上一篇部落格中,我們分析了AFHTTPSessionManager,以及它是如何實現GET/HEAD/PATCH/DELETE相關介面的。 我們還剩下POST相關介面沒有分析,在這篇部落格裡面,我們就來分析一下POST相關介面是如何實現的。 multipart/form-data請
SpringBoot2.0原始碼分析(四):spring-data-jpa分析
SpringBoot具體整合rabbitMQ可參考:SpringBoot2.0應用(四):SpringBoot2.0之spring-data-jpa JpaRepositories自動注入 當專案中存在org.springframework.data.jpa.repository.JpaRepositor
jdk原始碼分析(四)——垃圾收集器與記憶體分配策略
本章介紹的垃圾收集器與記憶體分配策略主要就三點。 第一點:垃圾收集(垃圾回收)。問題:哪些記憶體需要回收?什麼時候回收?如何回收? 第二點:介紹垃圾收集器。問題:有幾種型別是垃圾收集器?根據第一點的介紹,屬於那種型別的? 第三點:記憶體分配。問題:怎麼分配的? 一、垃
Java多執行緒之Condition實現原理和原始碼分析(四)
章節概覽、 1、概述 上面的幾個章節我們基於lock(),unlock()方法為入口,深入分析了獨佔鎖的獲取和釋放。這個章節我們在此基礎上,進一步分析AQS是如何實現await,signal功能。其功能上和synchronize的wait,notify一樣。
Muduo網路庫原始碼分析(四)EventLoopThread和EventLoopThreadPool的封裝
muduo的併發模型為one loop per thread+ threadpool。為了方便使用,muduo封裝了EventLoop和Thread為EventLoopThread,為了方便使用執行緒
HashMap原始碼分析(四)put-jdk8-紅黑樹的引入
HashMap jdk8以後他的邏輯結構發生了一點變化: 大概就是這個意思: 當某一個點上的元素數量打到一定的閾值的時候,連結串列會變成一顆樹,這樣在極端情況下(所有的元素都在一個點上,整個就以連結串列),一些操作的時間複雜度有O(n)變成了O(logn)。 分析原始碼
Libevent原始碼分析(四)--- libevent事件機制
之前幾個章節都是分析libevent的輔助功能,這一節將要詳細分析libevent處理事件的流程和機制,在分析之前先看一下libevent的使用方法,本文也將以libevent的使用方式入手來分析libevent的工作機制。 void cb_func(ev
spring4.2.9 java專案環境下ioc原始碼分析(四)——refresh之obtainFreshBeanFactory方法(@2處理Resource、載入Document及解析前準備)
接上篇文章,上篇文章講到載入完返回Rescouce。先找到要解析的程式碼位置,在AbstractBeanDefinitionReader類的loadBeanDefinitions(String location, Set<Resource> actualResou
EventBus原始碼分析(四):執行緒模型分析(2.4版本)
EventBus有四種執行緒模型 PostThread模式不需執行緒切換,直接在釋出者執行緒進行事件處理。 MainThread模式分類討論:釋出者執行緒是主執行緒則直接呼叫事件處理方法,否則通過Handler進行執行緒切換,切換到主執行緒處理事件,該模
OkHttp 3.7原始碼分析(四)——快取策略
合理地利用本地快取可以有效地減少網路開銷,減少響應延遲。HTTP報頭也定義了很多與快取有關的域來控制快取。今天就來講講OkHttp中關於快取部分的實現細節。 1. HTTP快取策略 首先來了解下HTTP協議中快取部分的相關域。 1.1 Expires
leaf原始碼分析(四)----console和module
Leaf 是一個由 Go 語言(golang)編寫的開發效率和執行效率並重的開源遊戲伺服器框架。Leaf 適用於各類遊戲伺服器的開發,包括 H5(HTML5)遊戲伺服器。 已經分析過的文章有 Console C
GZIP原始碼分析(一)
Gzip是Linux下的壓縮軟體,.gz字尾的檔案就是經gzip壓縮後的檔案。Gzip的原始碼當然由壓縮和解壓縮兩部分構成,但本文只打算介紹其壓縮部分,這部分的程式碼風格良好,且註釋充分,並能很好的體現所用到的演算法,而解壓的程式碼完全是沒有註釋的一坨,其解壓思路我們大致可
libevent原始碼分析(四)
還是上次那個訊號函式的例子, sample/signal-test.c——註冊訊號以及回撥事件。 /* Initalize one event */ event_set(&signal_int, SIGINT, EV_SIGNAL|EV_PERSIST,
AFNetworking3.1.0原始碼分析(四)詳解AFHTTPRequestSerializer 之初始化方法
1:類圖介紹 在AFHTTPSessionManager 初始化方法中可以看到 AFNetworking 預設使用的網路請求序列化類是AFHTTPRequestSerializer,一下是關於它的類圖: 2:類功能分析: 一:初始化函式: - (instancetyp
Java容器類原始碼-Vector的最全的原始碼分析(四)
(31) public synchronized boolean retainAll(Collection<?> c) 原始碼解釋: 將陣列中不是c中包含的元素全部移除。呼叫AbstractCollection的實現,程式碼也很簡單,不贅