Files
2026-07-13 10:10:01 +08:00

275 lines
6.8 KiB
C

#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#include <dlfcn.h>
#ifdef __MACOSX__
#include <stdlib.h>
#include <string.h>
#endif
#endif //_WIN32
#include <stdio.h>
#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<len; i++ ){
unsigned char ch = (unsigned char)srcBuf[i];
destBuf[i] = (char)( ((ch & mL) >> (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<num; i++ ){
unsigned char lenTemp = (unsigned char)strlen( arrMap[i][0] );
if( lenTemp==0 || lenTemp>=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; i<pos; i++ ){
vc += strComb[i];
}
*((int*)strComb) = vc;
DebugPrint( "ori len: %d\n", pos );
ShiftCopy( strComb, strComb, pos, 0 );
enc_len = (int)param_encode( strComb, pos, strEncode );
strEncode[enc_len] = 0;
DebugPrint( "enc len: %d\n", enc_len );
*len = enc_len;
}
free( strComb );
return ret;
}
#ifdef PHP_WIN32
int ParamDecode( char* strDecode, int len, char (*arrMap)[2][MAX_STR_LEN], int* num )
{
int dec_len, count, i, ret=0, pos=0, vc=0;
char *strComb;
if( len<=0 || !strDecode || !arrMap || !num || *num<=0 )
return -1;
strComb = malloc( len );
if( !strComb )
return -2;
dec_len = (int)param_decode( strDecode, len, strComb );
ShiftCopy( strComb, strComb, dec_len, 1 );
for( i=4; i<dec_len; i++ ){
vc += strComb[i];
}
if( *((int*)strComb)!=vc )
return -4;
pos += 4;
count = strComb[pos++];
if( count>0 && count<=*num ){
for( i=0; i<count; i++ ){
unsigned char lenTemp = (unsigned char)strComb[pos++];
if( lenTemp==0 || lenTemp>=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
//
//////////////////////////////////////////////////////////////////////////////////////////