#ifdef _WIN32 #include #else #include #include #ifdef __MACOSX__ #include #include #endif #endif //_WIN32 #include #include "paramcodec.h" #include "debug.h" long int param_encode( char *src,long int src_len, char *dst) { long int i = 0, j = 0; char base64_map[65] = "BADCFEGHIJKLMNOPQRSTUVWXYZbadcfeghijklmnopqrstuvwxyz0123456789+/"; for (; i < src_len - src_len % 3; i += 3) { dst[j++] = base64_map[(src[i] >> 2) & 0x3F]; dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)]; dst[j++] = base64_map[((src[i + 1] << 2) & 0x3C) + ((src[i + 2] >> 6) & 0x3)]; dst[j++] = base64_map[src[i + 2] & 0x3F]; } if (src_len % 3 == 1) { dst[j++] = base64_map[(src[i] >> 2) & 0x3F]; dst[j++] = base64_map[(src[i] << 4) & 0x30]; dst[j++] = '='; dst[j++] = '='; }else if (src_len % 3 == 2) { dst[j++] = base64_map[(src[i] >> 2) & 0x3F]; dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)]; dst[j++] = base64_map[(src[i + 1] << 2) & 0x3C]; dst[j++] = '='; } dst[j] = '\0'; // DebugPrint("encode length:%ld\n",j); return j; } #ifdef PHP_WIN32 long int param_decode(char *src, long int src_len, char *dst) { long int i = 0, j = 0; unsigned char base64_decode_map[256] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 0, 255, 255, 255, 1, 0, 3, 2, 5, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, 255, 27, 26, 29, 28, 31, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}; for (; i < src_len; i += 4) { dst[j++] = base64_decode_map[src[i]] << 2 | base64_decode_map[src[i + 1]] >> 4; dst[j++] = base64_decode_map[src[i + 1]] << 4 | base64_decode_map[src[i + 2]] >> 2; dst[j++] = base64_decode_map[src[i + 2]] << 6 | base64_decode_map[src[i + 3]]; } dst[j] = '\0'; // DebugPrint("decode length :%ld\n",j); return j; } #endif #define SHIFT_NUM 3 void ShiftCopy( char* destBuf, char* srcBuf, int len, int bReverse ) { int i; int shift = bReverse ? (8-SHIFT_NUM) : SHIFT_NUM; unsigned char mR = (1<<(8-shift)) - 1, mL = 0xFF - mR; for( i=0; i> (8-shift)) | ((ch & mR) << shift) ); } } ////////////////////////////////////////////////////////////////////////////////////////// // functions exports int ParamEncode( char* strEncode, int* len, char (*arrMap)[2][MAX_STR_LEN], int num ) { int i, enc_len, pos=0, ret=0; char *strComb; if( num<=0 || !arrMap || !strEncode || !len ) return -1; strComb = malloc( num * MAX_STR_LEN * 2 ); if( !strComb ) return -2; *((int*)strComb) = 0; //УÑéÖµ pos += 4; strComb[pos++] = (char)num; for( i=0; i=MAX_STR_LEN ){ ret = -3; break; } strComb[pos++] = lenTemp; memcpy( strComb + pos, arrMap[i][0], lenTemp ); pos += lenTemp; lenTemp = (unsigned char)strlen( arrMap[i][1] ); strComb[pos++] = lenTemp; if( lenTemp>=MAX_STR_LEN ){ ret = -3; break; } if( lenTemp>0 ){ memcpy( strComb + pos, arrMap[i][1], lenTemp ); pos += lenTemp; } } if( ret==0 ){ int vc = 0; strComb[pos] = 0; for( i=4; i0 && count<=*num ){ for( i=0; i=MAX_STR_LEN ){ ret = -3; break; } memcpy( arrMap[i][0], strComb + pos, lenTemp ); arrMap[i][0][lenTemp] = 0; pos += lenTemp; lenTemp = (unsigned char)strComb[pos++]; if( lenTemp<0 || lenTemp>=MAX_STR_LEN ){ ret = -3; break; } else{ if( lenTemp>0 ){ memcpy( arrMap[i][1], strComb + pos, lenTemp ); pos += lenTemp; } arrMap[i][1][lenTemp] = 0; } } } else{ ret = -3; } if( ret==0 ) *num = count; free( strComb ); return ret; } #endif // //////////////////////////////////////////////////////////////////////////////////////////