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 }