#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
using namespace std;
class TLV
{
public:
string tag;
unsigned int length;
string value;
TLV(string data)
{
value = "";
//If there is enough data
if(data.length() >= 4)
{
tag = data.substr(0,2);
sscanf(data.substr(2,4).c_str(),"%2x",&length);
//If there is enough data
if(data.length() >= 4 + length*2) value = data.substr(4,length*2);
}
}
static void parseTLV(string data, vector<TLV*> &res)
{
while(data.length() >= 4)
{
TLV *t = new TLV(data);
if(t->value == "") break;
res.push_back(t);
data = data.substr(4+(t->length+t->length));
}
if(data.length() != 0)
{
//Whole data is not in TLV format. Can throw some error
cout<<"ERROR [1] :: ["<<data<<"]\n";
}
}
};
int main()
{
string data;// = "0007AAAAAAAAAAAAAA010FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0220AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
cin>>data;
vector<TLV*> res;
TLV::parseTLV(data, res);
for(TLV *t:res)
{
printf("%s | %02X | %s |\n",t->tag.c_str(),t->length,t->value.c_str());
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y3N0ZGlvPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgVExWCnsKCXB1YmxpYzoKCgkJc3RyaW5nIHRhZzsKCQl1bnNpZ25lZCBpbnQgbGVuZ3RoOwoJCXN0cmluZyB2YWx1ZTsKCgkJVExWKHN0cmluZyBkYXRhKQoJCXsKCQkgICAgdmFsdWUgPSAiIjsKCQkJLy9JZiB0aGVyZSBpcyBlbm91Z2ggZGF0YQoJCQlpZihkYXRhLmxlbmd0aCgpID49IDQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRhZyA9IGRhdGEuc3Vic3RyKDAsMik7CiAgICAgICAgICAgICAgICBzc2NhbmYoZGF0YS5zdWJzdHIoMiw0KS5jX3N0cigpLCIlMngiLCZsZW5ndGgpOwoKICAgICAgICAgICAgICAgIC8vSWYgdGhlcmUgaXMgZW5vdWdoIGRhdGEKICAgICAgICAgICAgICAgIGlmKGRhdGEubGVuZ3RoKCkgPj0gNCArIGxlbmd0aCoyKSB2YWx1ZSA9IGRhdGEuc3Vic3RyKDQsbGVuZ3RoKjIpOwogICAgICAgICAgICB9CgkJfQoKCQlzdGF0aWMgdm9pZCBwYXJzZVRMVihzdHJpbmcgZGF0YSwgdmVjdG9yPFRMVio+ICZyZXMpCgkJewoJCQl3aGlsZShkYXRhLmxlbmd0aCgpID49IDQpCgkJCXsKCQkJCVRMViAqdCA9IG5ldyBUTFYoZGF0YSk7CgkJCQlpZih0LT52YWx1ZSA9PSAiIikgYnJlYWs7CgkJCQlyZXMucHVzaF9iYWNrKHQpOwogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3Vic3RyKDQrKHQtPmxlbmd0aCt0LT5sZW5ndGgpKTsKCQkJfQoKCQkJaWYoZGF0YS5sZW5ndGgoKSAhPSAwKQoJCQl7CgkJCQkvL1dob2xlIGRhdGEgaXMgbm90IGluIFRMViBmb3JtYXQuIENhbiB0aHJvdyBzb21lIGVycm9yCgkJCQljb3V0PDwiRVJST1IgWzFdIDo6IFsiPDxkYXRhPDwiXVxuIjsKCQkJfQoJCX0KfTsKCgppbnQgbWFpbigpCnsKCXN0cmluZyBkYXRhOy8vID0gIjAwMDdBQUFBQUFBQUFBQUFBQTAxMEZBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEwMjIwQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSI7CgljaW4+PmRhdGE7Cgl2ZWN0b3I8VExWKj4gcmVzOwoJVExWOjpwYXJzZVRMVihkYXRhLCByZXMpOwoJZm9yKFRMViAqdDpyZXMpCgl7CgkJcHJpbnRmKCIlcyB8ICUwMlggfCAlcyB8XG4iLHQtPnRhZy5jX3N0cigpLHQtPmxlbmd0aCx0LT52YWx1ZS5jX3N0cigpKTsKCX0KCXJldHVybiAwOwp9Cg==