У меня есть вложенный список формы,
{stack, "over", flow, ["is", "a"], ["knowledge", "sharing", "site"], "a", "b"}
Я не могу точно расшифровать вышеприведенный кортеж. Я расшифровал вышеупомянутое в
vector<vector<string> >
Однако, если я заменю внутренние списки на кортеж, я смогу декодировать этот штраф. Я сомневаюсь, что использование ERL_NIL_EXT и ERL_LIST_EXT, но документация только немного полезна.
Идея в том, что если я получу список внутри своего кортежа, я расшифрую его, верну вектор строк и проведу линейный обход кортежа. Но я не уверен, что не так. Помогите!
Код:
vector< vector<string> > decode_tuple(char *buff)
{
vector< vector<string> > decoded_tuple;
int index = 0;
int size;
int res = ei_decode_tuple_header(buff, &index, &size);
for(int i = 0; i < size; ++i)
{
int entry_size;
int type;
int res = ei_get_type(buff, &index, &type, &entry_size);
char *decoded_val = (char *) malloc(sizeof(char) * (entry_size + 1));
switch (type)
{
case ERL_ATOM_EXT:
{
vector<string> value;
ei_decode_atom(buff, &index, decoded_val);
cout<<decoded_val<<endl;
value.push_back(decoded_val);
decoded_tuple.push_back(value);
free(decoded_val);
break;
}
case ERL_STRING_EXT:
{
vector<string> value;
ei_decode_string(buff, &index, decoded_val);
cout<<decoded_val<<endl;
value.push_back(decoded_val);
decoded_tuple.push_back(value);
free(decoded_val);
break;
}
case ERL_SMALL_TUPLE_EXT:
case ERL_LARGE_TUPLE_EXT:
{
pair<int, vector<string> > value;
value = decode_inner_tuple(buff, index);
index = value.first;
decoded_tuple.push_back(value.second);
break;
}
case ERL_NIL_EXT:
{
vector<string> value;
ei_decode_string(buff, &index, decoded_val);
free(decoded_val);
break;
}
case ERL_LIST_EXT:
{
pair<int, vector<string> > value;
value = decode_inner_list(buff, index);
index = value.first;
decoded_tuple.push_back(value.second);
break;
}
default:
cout<<"Not a valid string"<<endl;
break;
}
}
return decoded_tuple;
}
pair<int, vector<string> > decode_inner_list(char *buff, int index)
{
vector<string> decoded_list;
int size;
int res = ei_decode_list_header(buff, &index, &size);
for(int i = 0; i < size; ++i)
{
int entry_size;
int type;
int res = ei_get_type(buff, &index, &type, &entry_size);
if(type == ERL_STRING_EXT)
{
char *decoded_value = (char *)malloc(sizeof(char) * (entry_size + 1));
ei_decode_string(buff, &index, decoded_value);
decoded_list.push_back(decoded_value);
free(decoded_value);
}
else
{
cout << "Not a valid string" << endl;
break;
}
}
return make_pair(index, decoded_list);
};
Проблема в том, как вы справляетесь ERL_NIL_EXT
, Этот тип представляет пустой список, что означает, что он состоит только из заголовка списка без элементов. Чтобы декодировать его, просто декодируйте заголовок списка:
case ERL_NIL_EXT:
ei_decode_list_header(buff, &index, &entry_size);
break;
Других решений пока нет …