PackBits解壓縮演算法
阿新 • • 發佈:2020-09-17
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 }