PackBit 壓縮編譯碼方式小記

2021-08-14 13:14:46 字數 3209 閱讀 7606

今天工作遇到這種壓縮方式,沒看太懂,所以就自己查了資料對packbit編碼有了個大概的了解,在此記錄下來,留給以後的自己!

packbits

是一種快速,簡單的

無失真壓縮

方案,用於

資料的首席執行官度編碼。在

電腦上推出了macpaint

版本的packbits格式

。這種壓縮方案是可以在

tiff

檔案中使用的壓縮型別之一

。tga

檔案也使用這種rle壓縮方案,但將資料流視為畫素而不是位元組。

乙個packbits資料流由包含乙個位元組頭的資料報組成。

頭是有符號的位元組; 

資料可以是有符號的,無符號的或打包的(例如macpaint畫素)。

在下表中,

n是頭位元組的值,作為有符號整數。

頭位元組資料在標題位元組之後

0至127

(1個+ ñ)

文字的資料的位元組

-1到-127

乙個位元組的資料,

在解壓縮的輸出中

重複(1 - n)次

-128

無操作(跳過並將下乙個位元組視為標題位元組)

請注意,將0解釋為正值或負值不會影響輸出。

與非執行相鄰的兩個位元組的執行通常寫為文字資料。

還應該注意的是,根據packbits資料來確定資料流的結束是沒有辦法的。

也就是說,在讀取packbits資料流之前,必須知道壓縮或未壓縮資料的大小,以知道它的結束位置。

用自己理解的話講就是:

pack bit壓縮方式是採用頭位元組計數,後位元組記值的方式,第乙個位元組記錄後面有幾個重複的位元組或者記錄後面有幾個不重複的位元組,記錄重複的

用負數表示 ,比如 -1 ff,表示原碼是 ff ff ,1代表記錄了兩個數 (從0開始算)所以解碼後就是兩個 ff,乙個位元組記錄重複的個數最多記錄127個 ,(高位為符號位 有效計數字 只有後面7位 0111 1111 (127)),記錄不重複的位元組數時用正數來記錄個數範圍 0 - 127,比如 fe ff f0 fd 這個一共四個位元組,編碼後就是0x03 fe ff f0 fd ,解碼的規則逆推就可以了.

如果有乙個位元組序列,比如 ff ff ff f0 f0 f0 六個位元組,如果用pack bit編碼來壓縮它 就是前3個ff相同可以編碼成 -3 ff,後面3個f0 也是相同的 也可以編碼成 -3 f0, 由於計數是從0開始的 所以3個數可以用2來計數,這樣壓縮結果就是-2 ff -2 ff,用16進製制列印就是 fe ff fe f0 (-2 的原碼是 1000 0010 符號位不管 反碼是 1111 1101  然後反碼加1 得到補碼 1111 1110 就是fe )

#include #include #include static int zjf_packbit_enc_fun();

static int zjf_packbit_dec_fun(char *src,int srclen,char *dst,int *dstlen);

static int zjf_packbit_enc_fun(char *src,int srclen,char *dst,int *dstlen)

/*取出第乙個位元組*/

char firstbyte = *src;

char *tempbyte = src; /*用於迴圈*/

samebytenum = 0;

/*記錄有幾個位元組是相同的*/

for(int i = 0; i < srclen; ++i)

else

}/*對相同的位元組進行壓縮編碼,由於packbits壓縮是採用標記位元組來記錄相同位元組的個數和不同位元組的個數,

若標記位元組n在0 - 127(0x7f)之間,則表示後面n個位元組是未壓縮的,解碼時可以直接拷貝,若標記位元組n在-1 到 -127 之間

則表示後面有(1 - n)個相同的資料,若n = -128 則跳過它*/

loop:

if(samebytenum > 1)

else

*dst++ = firstbyte;

outlen++;

}else

else

*dst++ = firstbyte;

outlen++;

src++; }}

*dstlen = outlen;

return 0;}/*

srcbyte :待重複拷貝的位元組

cpynum  :需要重複拷貝的個數

*/static int zjf_packbit_samecpy_fun(char srcbyte,char *dst,int cpynum)

return 0;}/*

src     : 源位址

cpynum  :需要拷貝的個數

*/static int zjf_packbit_differentcpy_fun(char *src,char *dst,int cpynum)

static int zjf_packbit_dec_fun(char *src,int srclen,char *dst,int *dstlen)

/*取出第乙個位元組*/

char firstbyte = *src;

if(firstbyte < 0)

else

}*dstlen =  outlen;

return 0;

}int main( )

memset(strin,0,240);

ncount = 2;

strin[0] = 0xd6;

strin[1] = 0xe0;

/*strin[2] = 0xff;

strin[3] = 0xf0;

strin[4] = 0xf0;

strin[5] = 0xf0;*/

}if(null == strout)

memset(strout,0,240);

}int dstlen = 0;

/*編碼*/

zjf_packbit_enc_fun(strin,ncount,strout,&dstlen);

for(int i = 0; i < dstlen; ++i)

/*解碼*/

zjf_packbit_dec_fun(&strout[0],dstlen,&strin[0],&ncount);

for(int i = 0; i < ncount; ++i)

return 0;

}

Web編譯碼方式集合

做中文站點,在url中使用中文引數太正常了,比如 http website list.asp keyword 關鍵字 在理想狀態下,是不需要做任何的處理,list.aspx頁面可以接收到 關鍵字 這個中文引數,但相當一部分情況下,會得到亂碼,所以為了安全保險起見,我們還是要對中文字元作一下編碼,編碼...

Python JSON編譯碼方式原理詳解

這篇文章主要介紹了python json編譯碼方式原理詳解,文中通過示例 介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下 概念json j ascript object notation 是一種輕量級的資料交換格式,易於人閱讀和編寫。在日常的工作中,應用範圍極其廣泛...

opencv 學習之 編譯碼方式讀取

先看一段 include cv.h include highgui.h using namespace cv int main code 0 n 255 for int i 1 i 4 i for int i 0 i 4 i printf c code i printf n n int n cvge...