Decoding the Message

To decode a message, follow these steps:

  1. Create the working buffer
  2. Create the message data struct variable
  3. Do the decoding by calling the decode routine
  4. Process the result of the decoding
  5. Free the data struct variable's memory
  6. Free the working buffer

Create the working buffer

The working buffer can be created by like this:

char bytes[] = { 0x30,0x2D,0x80,0x01,0xFF,0x81,0x01,0x00,0xA2,0x04,0x80,0x02,0x04,0xC0,0x83,0x0E,
                 0x77,0x77,0x77,0x2E,0x61,0x73,0x6E,0x6C,0x61,0x62,0x2E,0x63,0x6F,0x6D,0x84,0x0F,
                 0x32,0x30,0x31,0x30,0x30,0x32,0x30,0x32,0x31,0x34,0x30,0x32,0x30,0x32,0x5A };
/*
 * Wraps a byte array into a buffer
 */
Buffer* buffer = wrapBuffer(bytes, N(bytes), BASIC_ENCODING_RULES);

Create the message data struct variable

Create the message data struct variable, do not fill the content, but initialize the whole memory with zeros:

struct GetRequest myRequest = { 0 };

Do the decoding by calling the decode routine

/*
 * Do the decoding
 */
int result = decode_GetRequest(buffer, &myRequest);
The return result of the decoding is explained in the same way as of encoding.

Process the result of the decoding

The example here just prints out the readable message:

/*
 * Process the result of the decoding: print out readable information
 */
print_GetRequest(&myRequest, printf);

Free the data struct variable's memory

The struct specific free routine must be called to free the variable's dynamically allocated memory. This routine doesn't free the variable's memory itself, because it may be allocated statically.

/*
 * Free the data struct variable's memory
 */
free_GetRequest(&myRequest);

Free the working buffer

If this working buffer is created by calling wrapBuffer(), calling asn_free() to free the buffer itself is enough:

/*
 * Free the working buffer
 */
asn_free(buffer);
But if the working buffer is created by calling allocBuffer(), freeBuffer() should be called to free the buffer's content (byte array) and the buffer itself.

The Whole Decoding Example

#include "GetRequest.h"
#include "stdio.h"

#define N(arr) sizeof(arr)/sizeof(arr[0])

int main(void) {
	
	char bytes[] = { 0x30,0x2D,0x80,0x01,0xFF,0x81,0x01,0x00,0xA2,0x04,0x80,0x02,0x04,0xC0,0x83,0x0E,
	                 0x77,0x77,0x77,0x2E,0x61,0x73,0x6E,0x6C,0x61,0x62,0x2E,0x63,0x6F,0x6D,0x84,0x0F,
	                 0x32,0x30,0x31,0x30,0x30,0x32,0x30,0x32,0x31,0x34,0x30,0x32,0x30,0x32,0x5A };
	/*
	 * Wraps a byte array into a buffer
	 */
	Buffer* buffer = wrapBuffer(bytes, N(bytes), BASIC_ENCODING_RULES);
	
	if(buffer!=NULL) {
		struct GetRequest myRequest = { 0 };
		/*
		 * Do the decoding
		 */
		int result = decode_GetRequest(buffer, &myRequest);
		if(result==0) {
			/*
			 * Process the result of the decoding: print out readable information
			 */
			print_GetRequest(&myRequest, printf);
			printf("\n");
		}
		else {
			printf("Error Code: %d\n", result);	
		}
		/*
		 * Free the data struct variable's memory
		 */
		free_GetRequest(&myRequest);
		
		/*
		 * Free the working buffer
		 */
		asn_free(buffer);	
	}
	
	return 0;
}