BerTLV 的C++实现
我写了一个实现能够进行BerTLV大部分操作的C++类,代码如下:
这个实现用迭代器统一了数组与流,所以本类可以接受数组输入或流输入。
操作示例:
void TestBerTLV() { try { TagType tag; char * tagstr = "\x70\x80"; char * tagstr1 = "\x1F\x70"; BerTLV::ParseTag(tagstr, tagstr + 2, tag); assert(tag == 0x70); BerTLV::ParseTag(tagstr1, tagstr1 + 2, tag); assert(tag == 0x1F70); uint32_t len; char *lenstr = "\x81\x10"; char *lenstr2 = "\x79\x10"; char *lenstr3 = "\x82\x10\x10"; BerTLV::ParseLen(lenstr, lenstr + 2, len); assert(len == 0x10); BerTLV::ParseLen(lenstr2, lenstr2 + 2, len); assert(len == 0x79); BerTLV::ParseLen(lenstr3, lenstr3 + 3, len); assert(len == 0x1010); BerTLV tlv(0x70); tlv.SetValue(HexData("5F340101").ToBin()); tlv.AppendChild(BerTLV(0x5A, HexData("123456").ToBin())); tlv.AppendChild(BerTLV(0xBF0C)); auto ptr = tlv.FindChild(0xBF0C); ptr->AppendChild(BerTLV(0x9F4D, HexData("0B0A").ToBin())); tlv.InsertChild(0x9F4D, BerTLV(HexData("95051122334455").ToBin())); BinData out_buf; BerTLV::EncapTLV(tlv, back_inserter(out_buf)); cout << out_buf.ToHex().c_str() << endl; BerTLV tlv2; BerTLV::ParseTLV(begin(out_buf), end(out_buf), tlv2); stringstream ss(ios_base::in | ios_base::out | ios_base::binary); ss >> noskipws; BerTLV::EncapTLV(tlv, ss); tlv2.Clear(); BerTLV::ParseTLV(ss, tlv2); out_buf.clear(); tlv2.EncapTLV(back_inserter(out_buf)); cout << out_buf.ToHex().c_str() << endl; } catch (const exception &e) { cout << "error:" << endl; cout << e.what() << endl; } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。