2016-04-20 1 views
1

У меня есть код C++, который получает данные из процесса erlang. Я получаю кортеж и используя ei_decode_tuple_header/4, я получил Арность списка, а затем использовать для цикла, чтобы пройти через элементы кортежа и декодировать каждый из них, как это:как использовать ei_decode_term для декодирования.

void decode_tuple(char *buff) { 
    int index = 0; 
    int size; 
    int type; 
    int res = ei_decode_tuple_header(buff, &index, &size); 
    if(res == 0) { 
    cout<<"Success"<<endl; 
    } else { 
    cout<<"Fail"<<endl; 
    } 

    for(int i = 0; i < size; ++i) { 
    char *p = (char*)malloc(sizeof(char) * 1000); 
    int res = ei_decode_string(buff, &index, p); 
    if(res == 0) { 
     cout<<"Success"<<endl; 
    } else { 
     cout<<"Fail"<<endl; 
    } 
    cout<<"The decoded string is "<<p<<endl; 
    } 
    } 

Однако, это работает отлично, когда все элементы в кортеже/списке имеют один и тот же тип. Я хотел бы расшифровать, каков бы ни был этот термин. Я знаю, что есть ei_decode_term, но документация настолько плоха, что я не мог понять, как это сделать?

Может ли кто-нибудь помочь! спасибо @

ответ

1

Вы пробовали с ei_decode_ei_term, что-то вроде:

void decode_tuple(char *buff) { 
    int index = 0; 
    int size; 
    int type; 
    int res = ei_decode_tuple_header(buff, &index, &size); 

    if(res == 0) { 
    cout << "Success" << endl; 
    } else { 
    cout << "Fail" << endl; 
    } 

    for(int i = 0; i < size; ++i) { 
    ei_term term; 
    int res = ei_decode_ei_term(buff, &index, &term); 
    if (res == 0) { 
     cout << "Success" << endl; 
    } else { 
     cout << "Fail" << endl; 
    } 
    cout << "The decoded data is " << term.value << endl; 
    } 
} 

ei_term определяется как:

typedef struct { 
    char ei_type; 
    int arity; 
    int size; 
    union { 
     long i_val; 
     double d_val; 
     char atom_name[MAXATOMLEN_UTF8]; 
     erlang_pid pid; 
     erlang_port port; 
     erlang_ref ref; 
    } value; 
} ei_term; 

Так что вам может понадобиться проверить term.ei_type для лучшего разборе

+1

Спасибо @ rorra, term.value относится к объединению, которое будет содержать либо float, char, atom, pid, port. Если в случае, я даю кортеж формы, {"a", "b", "c", ["d", "e", "f"], {"g", "h"}}, что похоже, не подходит для использования ei_decode_ei_term. Я хотел бы, чтобы общее решение расшифровывало любые термины erlang и рекурсивно, если это вводит какой-либо другой составной термин. любые указатели? Спасибо за подробный ответ – root

Смежные вопросы