#include #include "ParseAnyDataType.h" using namespace std; class ParseDataStream : ParseAnyDataType { public: explicit ParseDataStream(const char * dataSet); ~ParseDataStream() { } void parseAsnElement(const char * dataSet, int * offset, int elementLength, int overallLength); void echoDataStream(const char * dataSet, int offset); }; ParseDataStream::ParseDataStream(const char * dataSet) { int offset = 0; printf("Making the first call to parseAsnElement()\n"); parseAsnElement(dataSet, &offset, dataSet[1], strlen(dataSet)); } void ParseDataStream::parseAsnElement(const char * dataSet, int * offset, int elementLength, int overallLength) { char dataSetType; int i; // printf("ASN element length is %d\n", elementLength); // printf("ASN offset value is %d\n", *offset); // printf("ASN overall length is %d\n", overallLength); while (*offset < overallLength - 1) { //Get the type of the current element dataSetType = dataSet[*offset]; //Get the length of the current element elementLength = dataSet[*offset + 1]; // echoDataStream(dataSet, *offset); // printf("Dataset length %d\n", strlen(dataSet)); // printf("ASN element type is %x\n", dataSetType); // printf("ASN element length is %d\n", elementLength); // printf("ASN offset value is %d\n", *offset); switch (dataSetType) { case SEQ_CLASS: printf("ASN element type is SEQUENCE 0x%x\n", dataSetType); printf("ASN element length is %d\n", elementLength); printf("Making a recursive call to parseAsnElement()\n"); *offset += 2; parseAsnElement(dataSet, offset, elementLength, overallLength); break; case INT_CLASS: printf("\nASN element type is INTEGER 0x%x\n", dataSetType); printf("ASN element length is %d\n", elementLength); printf("Integer characters "); for (i = *offset + 2; i <= *offset + elementLength + 1; i++) printf("%x", dataSet[i]); printf("\n"); printf("Making a recursive call to parseAsnElement()\n"); *offset += 4; parseAsnElement(dataSet, offset, elementLength, overallLength); break; case STR_CLASS: printf("\nASN element type is STRING 0x%x\n", dataSetType); printf("ASN element length is %d\n", elementLength); printf("String character "); for (i = *offset + 2; i <= *offset + elementLength + 1; i++) printf("%c", dataSet[i]); printf("\n\n"); *offset += elementLength + 1; printf("Making a recursive call to parseAsnElement()\n"); parseAsnElement(dataSet, offset, elementLength, overallLength); break; default: printf("Unknown type\n"); break; } } } void ParseDataStream::echoDataStream(const char * dataSet, int offset) { for (int i = offset; i < strlen(dataSet); i++) printf("Data stream element at offset %d %x\n", i, dataSet[i]); } int main() { const char dataSet [] = { '\x30', '\x0C', '\x02', '\x02', '\x01', '\x0A', '\x04', '\x05', '\x48', '\x45', '\x4C', '\x4C', '\x4F', '\0'}; ParseDataStream* parseElement = new ParseDataStream(dataSet); return 0; }