MELNICA.ORG

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

Коментировать