C++ дессериализация PHP сессии
Пришлось столкнутся с проблемой когда нужно было по ключу вытянуть данные сессии и дессериализировать (привести в обычный массив). Было принято решение сделать средствами C++.
Пример дессериализации сессии PHP
#include
#include
#include
#include
#include
using namespace std;
std::map array;
struct fun_ret {
std::string val;
int iter;
};
struct arrStruct {
int iter;
std::string val;
};
fun_ret integer_deserialize(char *str, int i){
int poin_comma = 0;
int dubl_point = 0;
char tmp_str[11];
int j =0;
fun_ret result;
while(poin_comma<1){
if(str[i] == ';'){
poin_comma ++;
}
if(poin_comma == 0 && dubl_point == 1){
tmp_str[j] = str[i];
j++;
}
if(str[i]==':'){
dubl_point++;
}
i++;
}
i--;
tmp_str[j] = '\0';
result.val = tmp_str;
result.iter = i;
return result;
}
fun_ret string_deserialize(char* str, int i){
fun_ret result;
int dubl_apostr = 0;
int dubl_point = 0;
int size_str = 0;
char size_str_s[] = "";
int j =0;
int size_less_point = 0;
int size_less = 255;
while(dubl_point<2){
if(str[i] == ':')
dubl_point ++;
else if(dubl_point == 1){
size_str_s[j] = str[i];
j++;
}
i++;
}
size_str_s[j]='\0';
size_str = atoi(size_str_s);
char tmp_str[(size_str)];
j=0;
while(1){
if(dubl_apostr >=2 && str[i]==';')
break;
if(str[i]=='"'){
dubl_apostr ++;
}else{
if(j0){
tmp_str[size_less_point] = '\0';
}else{
tmp_str[j] = '\0';
}
result.val = tmp_str;
result.iter = i;
return result;
}
fun_ret array_deserialize(char* str, int i){
fun_ret result;
int parenthesis_open = 0;
int dubl_apostr = 0;
int check_arr = 0;
char tmp_val[2];
int a = 0;
fun_ret res;
while(1){
if(parenthesis_open == 0 && check_arr == 1)
break;
if(str[i]=='{'){
parenthesis_open ++;
}else if(str[i]=='}'){
parenthesis_open --;
}
if(parenthesis_open > 0){
check_arr = 1;
if(str[i]=='"' && dubl_apostr==1){
dubl_apostr = 0;
}else if(str[i]=='"'){
dubl_apostr = 1;
}
if(dubl_apostr == 0){
switch (str[i]){
case 'a':
res = array_deserialize(str, i);
a = res.iter;
i = a-1;
break;
case 'i':
break;
case 's':
break;
case 'd':
break;
}
}
}
i++;
}
tmp_val[0]='0';
tmp_val[1]='\0';
result.val = tmp_val;
result.iter = i;
return result;
}
std::map ses_unserialize(char* str){
std::map result;
int i = 0;
int dubl_apostr = 0;
std::map tmp_arr;
std::string tmp_key ;
std::string tmp_val;
int check=0;
int first_ind = 0;
char str_tmp[256];
int j =0;
fun_ret res;
while(str[i]){
if(str[i]=='"' && dubl_apostr==1){
dubl_apostr = 0;
}else if(str[i]=='"'){
dubl_apostr = 1;
}
if(str[i] == '|'){
str_tmp[j]='\0';
j=0;
tmp_key = str_tmp;
str_tmp[0] = '\0';
}else if( (str[i] == 'a'||str[i] == 'i'|| str[i] == 's' || str[i] == 'b' || str[i] == 'N' ) && (str[i+1] == ':' || str[i+1] == ';') && dubl_apostr ==0){
if(dubl_apostr == 0){
switch (str[i]){
case 'a':
if(i== 1) first_ind =1;
res = array_deserialize(str, i);
tmp_val = res.val;
i = res.iter-1;
check = 1;
break;
case 'i':
res = integer_deserialize(str, i);
tmp_val=res.val;
i = res.iter;
check = 1;
break;
case 's':
res = string_deserialize(str, i);
tmp_val = res.val;
i = res.iter;
check = 1;
break;
case 'd':
break;
case 'N':
tmp_val = "0";
check = 1;
i++;
break;
case 'b':
res = integer_deserialize(str, i);
tmp_val = res.val;
i = res.iter;
check = 1;
break;
}
if(check == 1){
if(first_ind == 1){
tmp_key[0] = '\n';
}
first_ind = 0;
tmp_arr[tmp_key] = tmp_val;
tmp_key[0] = '\0';
tmp_val[0] ='\0';
check =0;
}
}
}else{
str_tmp[j] = str[i];
j++;
}
i++;
}
return tmp_arr;
}
int main(){
std::map result;
result = ses_unserialize(test_str);
return 0;
}
Автор: Creyente
Коментировать