Add paramcodec file
This commit is contained in:
@@ -0,0 +1,275 @@
|
||||
#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
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user