PCL XL Run Length Encoding Compression Method (eRLECompression) c++实现

 此算法根据《PCL XL 2.0 reference》算法描述编写。

算法思路:根据数据的特征,将之前的数据状态分为三个:起始,相等,不等。开始处理数据的时候处于起始状态,起始状态可以直接向不等和相等状态转换。不等状态可以直接转换为相等状态,相等状态只可以转换为起始状态。

  1 enum STATE {DIFFER, EQUAL, START};
  2 void RLECompress(FX_INT8* inPut, FX_INT32 inLength, FX_INT8* outPut, FX_INT32& outLength)
  3 {
  4     STATE state = START;
  5     FX_INT32 lengthIndex = 0;
  6     outLength = 0;
  7     outPut[outLength++] = 0;
  8     outPut[outLength++] = inPut[0];
  9     for (FX_INT32 i = 1; i < inLength; i++)
 10     {
 11         if (inPut[i] == inPut[i - 1])
 12         {
 13             if (state == START)
 14             {
 15                 state = EQUAL;
 16                 outPut[lengthIndex]--;
 17             }
 18             else if (state == DIFFER)
 19             {
 20                 state = EQUAL;
 21                 outPut[lengthIndex]--;
 22                 outLength--;
 23                 lengthIndex = outLength;
 24                 outPut[outLength++] = -1;
 25                 outPut[outLength++] = inPut[i];
 26             }
 27             else
 28             {
 29                 if (outPut[lengthIndex] == -127)
 30                 {
 31                     state = START;
 32                     lengthIndex = outLength;
 33                     outPut[outLength++] = 0;
 34                     outPut[outLength++] = inPut[i];
 35                 }
 36                 else
 37                     outPut[lengthIndex]--;
 38             }
 39         }
 40         else
 41         {
 42             if (state == EQUAL)
 43             {
 44                 state = START;
 45                 lengthIndex = outLength;
 46                 outPut[outLength++] = 0;
 47                 outPut[outLength++] = inPut[i];
 48             }
 49             else if (state == START)
 50             {
 51                 state = DIFFER;
 52                 outPut[lengthIndex]++;
 53                 outPut[outLength++] = inPut[i];
 54             }
 55             else
 56             {
 57                 if (outPut[lengthIndex] == 127)
 58                 {
 59                     state = START;
 60                     lengthIndex = outLength;
 61                     outPut[outLength++] = 0;
 62                     outPut[outLength++] = inPut[i];
 63                 }
 64                 else
 65                 {
 66                     outPut[lengthIndex]++;
 67                     outPut[outLength++] = inPut[i];
 68                 }
 69             }
 70         }
 71     }
 72 }
 73 
 74 FX_BOOL RLEDeCompress(FX_INT8* inPut, FX_INT32 inLength, FX_INT8*& outPut, FX_INT32& outLength)
 75 {
 76     //First:Get length of deCompress data.
 77     outLength = 0;
 78     for (FX_INT32 i = 0; i < inLength; i++)
 79     {
 80         FX_INT8 data = inPut[i];
 81         if (data > 127 || data < -127)
 82             continue;
 83         if (data >= 0)
 84         {
 85             outLength += data + 1;
 86             i += data + 1;
 87         }
 88         else
 89         {
 90             outLength += 1 - data;
 91             i++;
 92         }
 93     }
 94 
 95     //Second:Decompress data.
 96     outPut = FX_Alloc(FX_INT8, outLength);
 97     if (!outPut)
 98         return FALSE;
 99     FX_INT32 index = 0;
100     for (FX_INT32 i = 0; i < inLength; i++)
101     {
102         FX_INT8 data = inPut[i];
103         if (data > 127 || data < -127)
104             continue;
105         if (data >= 0)
106         {
107             FX_INT32 length = data +1;
108             for (FX_INT32 j = 0; j < length; j++)
109             {
110                 i++;
111                 if (i >= inLength || index >= outLength)
112                 {
113                     FX_Free(outPut);
114                     outPut = NULL;
115                     return FALSE;
116                 }
117                 outPut[index++] = inPut[i];
118             }
119         }
120         else
121         {
122             FX_INT32 length = 1 - data;
123             i++;
124             if (i >= inLength || index >= outLength)
125             {
126                 FX_Free(outPut);
127                 outPut = NULL;
128                 return FALSE;
129             }
130             for (FX_INT32 k = 0; k < length; k++)
131             {
132                 outPut[index++] = inPut[i];
133             }
134         }
135     }
136     return TRUE;
137 }

 

转载于:https://www.cnblogs.com/DeepFlavor/p/9711845.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值