The following are the steps are involved in decoding a PER message using the generated C++ class:
Instantiate an ASN.1 PER decode buffer object (ASN1PERDecodeBuffer ) to describe the message to be decoded. The constructor takes as arguments a pointer to the message to be decoded, the length of the message, and a flag indicating whether aligned encoding was used or not.
Instantiate an ASN1T_<ProdName> object to hold the decoded message data.
Instantiate an ASN1C_<ProdName> object to decode the message. This class associates the message buffer object with the object that is to receive the decoded data. The results of the decode operation will be placed in the variable declared in step 2.
Invoke the ASN1C_<ProdName> object Decode method.
Check the return status. The return value is a status value indicating whether decoding was successful or not. Zero (0) indicates success. If decoding failed, the status value will be a negative number. The decode buffer method PrintErrorInfo can be invoked to get a textual explanation and stack trace of where the error occurred.
Release dynamic memory that was allocated by the decoder. All memory associated with the decode context is released when both the ASN1PERDecodeBuffer and ASN1C_<ProdName> objects go out of scope.
A program fragment that could be used to decode an employee record is as follows:
#include employee.h // include file generated by ASN1C main () { OSOCTET msgbuf[1024]; int msglen, stat; OSBOOL aligned = TRUE; .. logic to read message into msgbuf .. // step 1: instantiate a PER decode buffer object ASN1PERDecodeBuffer decodeBuffer (msgbuf, msglen, aligned); // step 2: instantiate an ASN1T_<ProdName> object ASN1T_PersonnelRecord msgData; // step 3: instantiate an ASN1C_<ProdName> object ASN1C_PersonnelRecord employee (decodeBuffer, msgData); // step 4: decode the record stat = employee.Decode (); // step 5: check the return status if (stat == 0) { process received data.. } else { // error processing.. decodeBuffer.PrintErrorInfo (); } // step 6: free dynamic memory (will be done automatically // when both the decodeBuffer and employee objects go out // of scope).. }
A stream can be used as the data input source instead of a memory buffer by creating an OSRT input stream object in step1 and associating it with the decodeBuffer object. For example, to read from a file input stream, the decodeBuffer declaration in step 1 would be replaced with the following two statements:
OSRTFileInputStream istrm (filename); ASN1PERDecodeBuffer decodeBuffer (istrm, aligned);