From 2a87652936f60c6970e5b6d109407cbd1d795523 Mon Sep 17 00:00:00 2001 From: alex_q <914269@qq.com> Date: Mon, 13 Jul 2026 10:10:01 +0800 Subject: [PATCH] Add paramcodec file --- Global/paramcodec.c | 275 ++++++++++++++++++++++++++++++++++++++++++++ Global/paramcodec.h | 24 ++++ 2 files changed, 299 insertions(+) create mode 100644 Global/paramcodec.c create mode 100644 Global/paramcodec.h diff --git a/Global/paramcodec.c b/Global/paramcodec.c new file mode 100644 index 0000000..bbb80d4 --- /dev/null +++ b/Global/paramcodec.c @@ -0,0 +1,275 @@ +#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 +// +////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/Global/paramcodec.h b/Global/paramcodec.h new file mode 100644 index 0000000..90cf5ab --- /dev/null +++ b/Global/paramcodec.h @@ -0,0 +1,24 @@ +#ifndef _PARAMCODEC_H_ +#define _PARAMCODEC_H_ + +#define MAX_KEY_NUM 32 +#define MAX_STR_LEN 256 + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32)&&!defined(PHP_WIN32) +_declspec(dllexport) +#endif + +int ParamEncode( char* strEncode, int* len, char (*arrMap)[2][MAX_STR_LEN], int num ); +#ifdef PHP_WIN32 +int ParamDecode( char* strDecode, int len, char (*arrMap)[2][MAX_STR_LEN], int* num ); +#endif + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file