壓縮凤粗,解壓縮數(shù)據(jù)塊的接口

壓縮一個數(shù)據(jù)塊

輸入:

  • ibuf 未壓縮數(shù)據(jù)塊
  • isize 輸入數(shù)據(jù)大小
  • obuf 壓縮后數(shù)據(jù)塊
  • osizm 輸出數(shù)據(jù)容量
    返回:
  • 0表示壓縮成功
  • *osizp 壓縮后數(shù)據(jù)的大小
static int pw__compress(byte* ibuf,uint isiz,byte* obuf,uint osizm,
  uint* osizp) {
  // 壓縮一個數(shù)據(jù)塊;
  // return: 0: compression was successful;
  //         !=0: error number from zlib;
  // *osizp: 壓縮后數(shù)據(jù)的大小;
  z_stream strm;
  int r,i;

  // initialization
  strm.zalloc= Z_NULL;
  strm.zfree= Z_NULL;
  strm.opaque= Z_NULL;
  strm.next_in= Z_NULL;
  strm.total_in= 0;
  strm.avail_out= 0;
  strm.next_out= Z_NULL;
  strm.total_out= 0;
  strm.msg= NULL;
  r= deflateInit(&strm,Z_DEFAULT_COMPRESSION);
  if(r!=Z_OK)
return r;

  // read data
  strm.next_in = ibuf;
  strm.avail_in= isiz;

  // compress
  strm.next_out= obuf;
  strm.avail_out= osizm;
  r= deflate(&strm,Z_FINISH);
  if(/*r!=Z_OK &&*/ r!=Z_STREAM_END) {
    deflateEnd(&strm);
    *osizp= 0;
    if(r==0) r= 1000;
return r;
    }

  // clean-up
  deflateEnd(&strm);
  obuf+= *osizp= osizm-(i= strm.avail_out);

  // add some zero bytes
  if(i>4) i= 4;
  while(--i>=0) *obuf++= 0;
  return 0;
  }  // end   pw__compress()

解壓縮

static int pb__decompress(byte* ibuf,uint isiz,byte* obuf,uint osizm,
  uint* osizp) {
  // 解壓縮一個數(shù)據(jù)塊;
  // return: 0: 解壓縮成功;
  //         !=0: error number from zlib;
  // *osizp: 解壓縮后的數(shù)據(jù)的大小;
  z_stream strm;
  int r,i;

  // 初始化
  strm.zalloc= Z_NULL;
  strm.zfree= Z_NULL;
  strm.opaque= Z_NULL;
  strm.next_in= Z_NULL;
  strm.total_in= 0;
  strm.avail_out= 0;
  strm.next_out= Z_NULL;
  strm.total_out= 0;
  strm.msg= NULL;
  r= inflateInit(&strm);
  if(r!=Z_OK)
return r;
  // 讀數(shù)據(jù)
  strm.next_in = ibuf;
  strm.avail_in= isiz;
  // 解壓縮
  strm.next_out= obuf;
  strm.avail_out= osizm;
  r= inflate(&strm,Z_FINISH);
  if(r!=Z_OK && r!=Z_STREAM_END) {
    inflateEnd(&strm);
    *osizp= 0;
return r;
    }
  // clean-up
  inflateEnd(&strm);
  obuf+= *osizp= osizm-(i= strm.avail_out);
  // 添加一些零字節(jié)
  if(i>4) i= 4;
  while(--i>=0) *obuf++= 0;
  return 0;
  }  // end   pb__decompress()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市今豆,隨后出現(xiàn)的幾起案子嫌拣,更是在濱河造成了極大的恐慌,老刑警劉巖呆躲,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件异逐,死亡現(xiàn)場離奇詭異,居然都是意外死亡插掂,警方通過查閱死者的電腦和手機灰瞻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辅甥,“玉大人酝润,你說我怎么就攤上這事∫” “怎么了夏块?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脐供。 經(jīng)常有香客問我,道長酌壕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任托猩,我火速辦了婚禮辽慕,結果婚禮上,老公的妹妹穿的比我還像新娘溅蛉。我一直安慰自己,他們只是感情好船侧,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布镜撩。 她就那樣靜靜地躺著,像睡著了一般袁梗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淋袖,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天锯梁,我揣著相機與錄音,去河邊找鬼剥懒。 笑死,一個胖子當著我的面吹牛蕊肥,可吹牛的內容都是我干的蛤肌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼展东,長吁一口氣:“原來是場噩夢啊……” “哼炒俱!你這毒婦竟也來了爪膊?” 一聲冷哼從身側響起砸王,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耘成,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘪菌,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡师妙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年屹培,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褪秀。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡溜歪,死狀恐怖许蓖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情膊爪,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布沛豌,位于F島的核電站,受9級特大地震影響加派,放射性物質發(fā)生泄漏。R本人自食惡果不足惜芍锦,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一飞盆、第九天 我趴在偏房一處隱蔽的房頂上張望次乓。 院中可真熱鬧孽水,春花似錦、人聲如沸女气。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽簇搅。三九已至,卻和暖如春瘩将,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姿现。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留异旧,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓吮蛹,卻偏偏與公主長得像拌屏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子每篷,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345