1. 程式人生 > 實用技巧 >PackBits解壓縮演算法

PackBits解壓縮演算法

PackBits壓縮方式是每段資料都有一個頭(有符號的8bit型別資料)和資料。具體形式如下圖所示。

當頭部的值為-1~-127表示頭部後面的1一個位元組的資料進行過資料壓縮,解壓縮時需要將頭部後面的一個位元組的資料重複頭部值的絕對值+1次。

當頭部的值為0~127表示頭部後面頭部值+1個位元組的資料沒有進行過資料壓縮,解壓時需要將頭部後面的頭部值+1個數據直接進行拷貝。

當頭部的值為-128時不進行任何操作,跳過。

具體的程式碼實現請參照下面的C實現的方式

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 typedef unsigned char
uint8; 4 typedef signed char int8; 5 void PackBitsDecode(uint8 *val, uint8 length); 6 int main() 7 { 8 uint8 value[] = { 0xfe,0xaa,0x02,0x80,0x00,0x2a,0xfd,0xaa,0x03,0x80,0x00,0x2a,0x22,0xf7,0xaa }; 9 PackBitsDecode(value, sizeof(value)); 10 getchar(); 11 return 0; 12 } 13 void PackBitsDecode(uint8 *val, uint8 length)
14 { 15 uint8 i = 0; 16 uint8 len = 0; 17 int8 data = 0; 18 uint8 str[256]; 19 while (1) 20 { 21 data = (int8)val[i++]; 22 if (data <= -1 && data >= -127) 23 { 24 memset(&str[len], val[i++], -data+1); 25 len += -data + 1
; 26 } 27 else if (data >= 0 && data <= 127) 28 { 29 memcpy(&str[len], &val[i], data + 1); 30 len += data + 1; 31 i += data + 1; 32 } 33 else 34 { 35 continue; 36 i++; 37 } 38 if (i == length) 39 { 40 printf("完全正確\r\n"); 41 break; 42 } 43 else if (i > length) 44 { 45 printf("存在錯誤\r\n"); 46 break; 47 } 48 } 49 for (i = 0; i < len; i++) 50 { 51 printf("The %d is %x\r\n", i, str[i]); 52 } 53 }