[erlang-questions] problem of ei_decode_string

caox <>
Mon Oct 25 14:09:02 CEST 2010


thanks a lot. I know where the problem is.

The return type of ei_get_type() will be ERL_LIST_EXT rather than ERL_STRING_EXT when string length is beyond 65535. So I should take care of this.
在 2010-10-25,下午6:40, Michael Santos 写道:

> On Mon, Oct 25, 2010 at 05:02:39PM +0800, caox wrote:
>> hi
>> 
>> 	I find there will be problem with this api when the length of list to be decoded is larger than 65535. Is this the limit of decoded string, or a bug?
> 
> A string in the external term format has a 2 byte length header. If the
> string length can't be represented in 2 bytes, it will be encoded as a
> list of small integers:
> 
> 1> term_to_binary(lists:flatten(lists:duplicate(16#ffff-1, "n"))).
> <<131,107,255,254,110,110,110,110,110,110,110,110,110,110,
>  110,110,110,110,110,110,110,110,110,110,110,110,110,110,
>  110,...>>
> 
> 131 = Erlang magic version number
> 107 = type is string
> 255,254 = length is 65534 bytes
> 110,... = "nnnn..."
> 
> 2> term_to_binary(lists:flatten(lists:duplicate(16#ffff, "n"))).
> <<131,108,0,0,255,255,97,110,97,110,97,110,97,110,97,110,
>  97,110,97,110,97,110,97,110,97,110,97,110,97,...>>
> 
> 131 = Erlang magic version number
> 108 = type is list
> 0,0,255,255 = length is 65535 bytes
> 97 = type is small integer
> 110 = "n"
> ...
> 
> ei_decode_string() works with both formats.
> 
> 



More information about the erlang-questions mailing list