• 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("完全正确
    ");
    41             break;
    42         }
    43         else if (i > length)
    44         {
    45             printf("存在错误
    ");
    46             break;
    47         }
    48     }
    49     for (i = 0; i < len; i++)
    50     {
    51         printf("The %d is %x
    ", i, str[i]);
    52     }
    53 }
  • 相关阅读:
    4.17 杂七杂八
    常量指针与指针常量
    作用域与命名空间
    QDataStream序列化的使用
    Qthread类的使用和控制台打印中文!
    Qproces的启动
    在centos7上安装部署hadoop2.7.3和spark2.0.0
    每天一点存储知识:集群Nas
    git 提交某个内容
    pyspider—爬取视频链接
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13684825.html
Copyright © 2020-2023  润新知