此算法根据《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 }