ASN.1 multiple records with multiple record definitions

Papa Tana papa.tana101@REDACTED
Tue Jun 30 15:16:02 CEST 2020


Hi,

[SOLVED]

=> not using SEQUENCE OF.
=> Data processing at the module-side (preferred way)

...
Eshell V11.0  (abort with ^G)
1> mymodule:start().
[{person,{'Person',"John Smith",5,38}},
 {contact,{'Contact',"Vanessa","123 456"}},
 {contact,{'Contact',"Alicia","987 654"}},
 {person,{'Person',"Mercator",home,32}}]
2>

This is the exactly I need: problem fixed.

Thanks a lot Lars,
Very Much appreciated!


2020-06-30 15:52 UTC+03:00, Lars Thorsen <lars.thorsen@REDACTED>:
> Hi,
> Here comes a solution for your problem (not using SEQUENCE OF).
> Compile your spec with the option undec_rest.
>
> asn1ct:compile("People.asn1", [undec_rest]).
>
> Then do a decode function in your module.
>
> decode(<<>>, Acc) ->
>     lists:reverse(Acc);
> decode(Data, Acc) ->
>     {ok, P, Rest} = 'People':decode('RecordType', Data),
>     decode(Rest, [P | Acc]).
>
> 1> {ok, Txt} = file:read_file("cdr.dat").
> 2> YourModule:decode(Data, []).
> [{person,{'Person',"John Smith",5,38}},
>  {contact,{'Contact',"Vanessa","123 456"}},
>  {person,{'Person',"Mercator",home,32}},
>  {contact,{'Contact',"Alicia","987 654"}}]
>
> Best Regards Lars
>
>
> -----Original Message-----
> From: erlang-questions <erlang-questions-bounces@REDACTED> On Behalf Of
> Papa Tana
> Sent: den 30 juni 2020 14:23
> To: erlang-questions@REDACTED
> Subject: Re: ASN.1 multiple records with multiple record definitions
>
> This project is SOLVED!!
> Let me share here the solution provided by some OTP team in my inbox.
>
> ===> SOLUTION: need to specify that there will be a sequence of RecordType.
>
> %% update People.asn
> List ::= SEQUENCE OF RecordType
>
> %% insert Data in the CDR-people.dat
> {ok, Binx} =
>          'People':encode('PList',
>                          [{person, {'Person', "John Smith", 5, 38}},
>                           {contact, {'Contact', "Vanessa", "123 456"}},
>                           {contact, {'Contact', "Alicia", "987 654"}},
>                           {person, {'Person', "Mercator", 0, 32}}]).
>
> file:write_file("CDR-people.dat", Binx).
>
> %% Retrieving all the values is successful {ok, Txt} =
> file:read_file("CDR-people.dat").
> 'People':decode('PList', Txt).
>
>
> N.B:
> But it works at THE ONLY CONDITION that I can change People.asn My project
> in the real world is that some vendor provides me a non-editable CDR.asn and
> a list of CDRxxxx.dat files containing different types of record.
> Maybe there is some Header as specified by OTP team, or any additional field
> that I am missing in the Binary result decoding, I will explore this way.
>
>
>
>> 2020-06-30 10:13 UTC+03:00, Papa Tana <papa.tana101@REDACTED>:
>> But when I'm reading the file, and decode, it only returns the first
>> Person, sounds like the 3 upcoming records are ignored:
>>
>


More information about the erlang-questions mailing list