1、介绍下ASN.1语法
http://download.csdn.net/detail/nnm2000/951821
2、工具功能介绍
计算TLV结构中的T,即tag值。
3、工具运行效果图:
#include <iostream> using namespace std; typedef enum _tagClass { UNIVERSAL = 0, APPLICATION = 1, CONTEXT_SPECIFIC = 2, PRIVATE = 3 }TagClass; typedef enum _tagStructType { PRIMITIVE = 0, CONSTRUCTED = 1 }TagStructType; unsigned int CalTagValue(int tag, TagClass cls, TagStructType pc, unsigned int *pResult); int main(int argc, char **argv) { int tag; unsigned int ResultLow = 0, ResultHigh = 0; TagClass cls = CONTEXT_SPECIFIC; TagStructType pc = PRIMITIVE; char chContinue = 0x0; do { cout<<"Plase input tagclass(0 = UNIVERSAL, 1 = APPLICATION, 2 = CONTEXT_SPECIFIC, 3 = PRIVATE):"<<endl; do { cout<<">"; cin>>tag; if ((tag != UNIVERSAL) && (tag != APPLICATION) && (tag != CONTEXT_SPECIFIC) && (tag != PRIVATE)) { cout<<"Input error!"<<endl; } else { cls = (TagClass)tag; break; } }while (true); cout<<"Please input tag struct type(0 = PRIMITIVE, 1 = CONSTRUCTED):"<<endl; do { cout<<">"; cin>>tag; if ((tag != PRIMITIVE) && (tag != CONSTRUCTED)) { cout<<"Input error!"<<endl; } else { pc = (TagStructType)tag; break; } }while(true); cout<<"Please input tag value:"<<endl; cout<<">"; cin>>tag; ResultLow = CalTagValue(tag, cls, pc, &ResultHigh); cout<<"The Result is:0x"<<hex<<ResultHigh<<ResultLow<<endl; cout<<"Do you want continue?(y/n):"<<endl; cout<<">"; cin>>chContinue; }while (tolower(chContinue) =='y'); return 0; } unsigned int CalTagValue(int tag, TagClass cls, TagStructType pc, unsigned int *pResult) { unsigned char chFirstByte = 0; switch (cls) { case UNIVERSAL: // bit7 = 0 , bit6 = 0 chFirstByte |= 0x0; break; case APPLICATION: // bit7 = 0, bit6 = 1 chFirstByte |= 0x40; break; case CONTEXT_SPECIFIC: // bit7 = 1, bit6 = 0 chFirstByte |= 0x80; break; case PRIVATE: // bit7 = 1, bit6 = 1 chFirstByte |= 0xc0; break; default: return 0; // error! } switch (pc) { case PRIMITIVE: //bi5 = 0 chFirstByte |= 0x0; break; case CONSTRUCTED: chFirstByte |= 0x20; break; default: return 0; //error } if ((0 <= tag) && (tag <= 30)) { chFirstByte |= (unsigned char)tag; return (unsigned int)(chFirstByte); // Success! } else if (tag >= 31) { chFirstByte |= 0x1f; // bit0 ~ bit4 all 1; int nTmp = tag; int nCount = 0; unsigned char szTmpBuf[7] = {0}; // 保存除第一个字节外的7个字节 while ((nTmp > 0) && (nCount < sizeof(szTmpBuf)/sizeof(unsigned char))) { szTmpBuf[nCount++] = nTmp % 0x80; nTmp /= 0x80; } unsigned char chTmp = 0; unsigned int nTempTag = 0; nTempTag |= chFirstByte; if (nCount < 3) { for (int i=0; i < nCount; i++) { chTmp &= 0x0; chTmp |= 0x80; // bit7 = 1 chTmp |= szTmpBuf[nCount - 1 - i]; nTempTag <<= 8; nTempTag |= chTmp; } nTempTag &= ~0x80; } else if ((nCount >= 3) && (nCount <= 7) && (NULL != pResult)) { *pResult &= 0x0; for (int i=0; i < nCount; i++) { chTmp &= 0x0; chTmp |= 0x80; // bit7 = 1 chTmp |= szTmpBuf[nCount - 1 - i]; *pResult <<= 8; *pResult |= ((nTempTag >> 24) & 0x0ff); nTempTag <<= 8; nTempTag |= chTmp; } nTempTag &= ~0x80; } else { return 0; // Overflow! } return nTempTag; // Success! } else { // error! } return 0; }