[erlang-questions] ei_decode ???

Romain Lenglet rlenglet@REDACTED
Wed Oct 4 07:47:42 CEST 2006


Sanjaya Vitharana wrote:
> Consider a List [A,B] where A,B=ANY integer (including 0..255)
>
> So how to decode it using ei_decode functions??

In that case, if the list contains only integers in [0..255], and 
if the list is flat, it will always be encoded as a string.
Otherwise, it will be encoded as a list of integers.

> Reason:
> (condsidering ei_get_type(buf, &index, &type, &size))
> 1.) [A,B] where ANY of A,B > 255 so [A,B] = List
> (ei_decode_list_header(...) works fine here) 2.) [A,B] where
> A,B <= 255 so [A,B] = String (in this case how to use
> ei_decode_string(...) to decode the values of A,B ??)
>
> of course I can use tuple to do this quickly. But like to know
> how to decode 2.) for my general knowledge

Here is a general and efficient algorithm for decoding a list of 
integers, simplified from actual code from Dryverl:

void foo(char *buffer, int *index) {

int is_string = 0;
char *string_buffer = NULL;
int size = 0;
unsigned long val = 0L;
int i = 0;

ei_get_type(buffer, index, &is_string, &size);
if (is_string = (is_string == ERL_STRING_EXT)) {
    /* Skip the string type and length. */
    *index += 1 + 2;
} else {
    /* Skip the list type and length. */
    ei_decode_list_header(buffer, index, NULL);
}

/* Decode and display every integer in the list. */
for (i = 0; i < size; i++) {
    if (is_string) {
        val = ((unsigned char*)buffer)[(*index)++];
    } else {
        ei_decode_ulong(buffer, index, &val);
    }
    printf("%lu\r\n", val);
}

/* Decode the tail of the list, if it was not empty.
  We assume that the list is flat,
  i.e. the tail is [], which encoded as one byte. */
if ((!is_string) && (size > 0)) *index++;
/* Or, more conventionally:
if ((!is_string) && (size > 0))
    ei_decode_list_header(buffer, index, NULL);
*/

}


You have to add error handling everywhere. I omitted it here for 
clarity.

An undocumented function of ei is ei_decode_intlist.
But my version above is more efficient, because it does no copy 
of data into a new array.

Regards,

-- 
Romain LENGLET
Pr. Chiba Shigeru Group
Dept. of Mathematical and Computing Sciences
Tokyo Institute of Technology



More information about the erlang-questions mailing list