?? berencoder.cpp
字號:
/* char ww[40]; _snprintf(ww,40,"%d", nIn); CBigInt::Encode(ww, pBodyString, nBodyLength); */ writeStream(pBodyString, nBodyLength); encodeLength(nBodyLength); if(tag != NULL) writeStream(tag, tagLen); else encodeTag(CASN1Tag::TAG_INTEGER, false); int end = m_nPos; nOutLength = end - start; return true; } bool CBEREncoder::encodeOctetString(const char *szIn, int nLength, int &nOutLength, char *tag, int tagLen) { int start = m_nPos; writeStream(szIn, nLength); encodeLength(nLength); if(tag != NULL) writeStream(tag, tagLen); else encodeTag(CASN1Tag::TAG_OCTET_STRING, false); int end = m_nPos; nOutLength = end - start; return true; } bool CBEREncoder::encodeObjectId(const int* iIn, int nCount, int &nOutLength) { int start = m_nPos; char * pBodyString = NULL; int nBodyLength; // Add by xxh 2006.4.26 nBodyLength=nCount; // end Add writeStream(pBodyString, nBodyLength); encodeLength(nBodyLength); encodeTag(CASN1Tag::TAG_OBJECT_IDENTIFIER, false); int end = m_nPos; nOutLength = end - start; return true; } bool CBEREncoder::encodeReal(double dIn, int &nOutLength, char *tag, int tagLen) { int start = m_nPos; int temp=0,comma,addlength,p=0,sign1=0,sign2=0,s=0,epos; int m=0,jj=0; char str[15],*part1,*part2; char realstring[50]; char *sstr,*mstr; int length1,length2,nBodyLength; char enMassita[20],enExponent[20]; if(dIn<0) sign1=-1; else sign1=1; sprintf(str,"%e",dIn); for(int i=0;str[i]!='\0';i++){ if (str[i]=='E'||str[i]=='e') {temp=i;break;} } epos=temp; for(int w=temp-1;w>1;w--) if (str[w]=='0') temp--; else break; part1 =new char[temp]; for(int n=0;n<temp;n++) { if ((str[n]<'0'||str[n]>'9')) continue; part1[jj]=str[n]; // if (str[n]=='.'||n!=0) {n=n+1;continue;} m=m*10+part1[jj]-48; jj++; } part1[temp]='\0'; for(int j=0;str[j]!='.';j++) { comma=j+1; } addlength=temp-comma-1; part2 =new char[strlen(str)-temp]; for(int k=epos+1;str[k]!='\0'&&str[k]!=' ';k++) { part2[p++]=str[k]; } part2[p]='\0'; if (part2[0]=='-')sign2=-1; else { sign2=1; } for(int h=1;h<p;h++) { s=s*10+part2[h]-48; } s=s*sign2-addlength; mstr= new char[1000]; sstr=new char[1000]; if (enInteger(m,mstr)==0) return 0; if (enInteger(s,sstr)==0) return 0; length1=strlen(mstr); length2=strlen(sstr); nBodyLength=length1+length2+2; if (sign1=-1) sprintf(realstring,"%c%c%s%s",'3',length2,sstr,mstr); else sprintf(realstring,"%c%c%s%s",'s',length2,sstr,mstr); // encodeLength(nLength); writeStream(realstring, nBodyLength); encodeLength(nBodyLength); if(tag != NULL) writeStream(tag, tagLen); else encodeTag(CASN1Tag::TAG_REAL, false); int end = m_nPos; nOutLength = end - start; // // // // delete []sstr; delete []mstr; return true; } bool CBEREncoder::encodeEnum(int nIn, int &nOutLength) { int start = m_nPos; int t,s; int nBodyLength,nLength; int j=0;//,l; // uInt; char strtemp[20]; char str[20]; char pBodyString[8]; sprintf(strtemp,"%x\0",nIn); strcpy(str,strtemp); if((strlen(strtemp)%2)==1) sprintf(str,"%d%s",0,strtemp);//sprintf(str,"%d%s\0",0,strtemp); //nBodyLength=strlen(str); //pBodyString =new char[strlen(str)/2]; if(nIn>=0) { pBodyString[j++]=0; } for(int k=0;k<strlen(str);k+=2){ // cout<<"\nstr["<<k<<"]:"<<str[k]<<" str["<<k+1<<"]:"<<str[k+1]<<endl; if((str[k]>='A')&&(str[k]<='F')) t=str[k]-57; else if((str[k]>='a')&&(str[k]<='f')) t=str[k]-87; else if ((str[k]>='0')&&(str[k]<='9')) t=str[k]-48; else continue; if((str[k+1]>='A')&&(str[k+1]<='F')) s=str[k+1]-57; else if((str[k+1]>='a')&&(str[k+1]<='f')) s=str[k+1]-87; else if((str[k+1]>='0')&&(str[k+1]<='9')) s=str[k+1]-48; else continue; pBodyString[j++]=t*16+s; }; // pBodyString[j+1]='\0'; nBodyLength=j; writeStream(pBodyString, nBodyLength); encodeLength(nBodyLength); encodeTag(CASN1Tag::TAG_ENUMERATED, false); //delete []pBodyString; int end = m_nPos; nOutLength = end - start; return true; } bool CBEREncoder::encodeUTF8String(const char* szIn, int nLength, int &nOutLength) { start(); return true; } bool CBEREncoder::encodeIpAddress(const char* szIn, int &nOutLength, char *tag, int tagLen) { int nBodyLength,nLength; nBodyLength=nLength=4; char szIpAddress[4]; int nLen = strlen(szIn); if(szIn == NULL || strlen(szIn) <= 0) return false; char *szIn2=(char*)szIn; int p = 0; for(int i=0;i<nLen;i++) { if(szIn[i] == '.') { szIpAddress[p++] = atoi(szIn2); szIn2 = (char*)&szIn[i+1]; if(p == 3) { szIpAddress[p++] = atoi(szIn2); break; } } } int start = m_nPos; writeStream(szIpAddress, nBodyLength); encodeLength(nLength); if(tag != NULL) writeStream(tag, tagLen); else encodeTag(CASN1Tag::TAG_NUMERICSTRING, false); int end = m_nPos; nOutLength = end - start; return true; } bool CBEREncoder::encodeNumericString(const char* szIn, int &nOutLength, char *tag, int tagLen) { int nBodyLength,nLength;//=strlen(szIn); nBodyLength=nLength=strlen(szIn); //pBodyString =new char[j]; //for(int i=0;i<j;i++) //pBodyString[i]=str2[i]; int start = m_nPos; writeStream(szIn, nBodyLength); encodeLength(nLength); if(tag != NULL) writeStream(tag, tagLen); else encodeTag(CASN1Tag::TAG_NUMERICSTRING, false); int end = m_nPos; nOutLength = end - start; return true; } bool CBEREncoder::encodePrintableString(const char* szIn, int &nOutLength) { start(); return true; } bool CBEREncoder::encodeT61String(const char* szIn, int &nOutLength) { start(); return true; } bool CBEREncoder::encodeVideotexString(const char* szIn, int &nOutLength) { start(); return true; } bool CBEREncoder::encodeIA5String(const char* szIn, int &nOutLength) { start(); return true; } bool CBEREncoder::encodeUTCTime(const char* szIn, int &nOutLength, char *tag, int tagLen) { /* char pBodyString[9],j=0; int nBodyLength,nLength; for(int i=0;i<12;i+=2) { pBodyString[j]=(szIn[i]-48)*16+(szIn[i+1]-48); j=j+1; } pBodyString[6]='+'; pBodyString[7]=0; pBodyString[8]=0; nBodyLength=nLength=9; */ char pBodyString[9],j=0; int nBodyLength,nLength; for(int i=0;i<12;i+=2) { pBodyString[j]=(szIn[i]-48)*16+(szIn[i+1]-48); j=j+1; } pBodyString[6]='+'; pBodyString[7]=0; pBodyString[8]=0; nBodyLength=nLength=9; int start = m_nPos; writeStream(pBodyString, nBodyLength); encodeLength(nLength); if(tag != NULL) writeStream(tag, tagLen); else encodeTag(CASN1Tag::TAG_UTCTIME, false); int end = m_nPos; nOutLength = end - start; return true; } bool CBEREncoder::encodeGeneralizedTime(const char* szIn, int &nOutLength) { /* char pBodyString[15]; int nBodyLength,nLength; for(int i=0;i<14;i++) pBodyString[i]=szIn[i]; pBodyString[14]='Z'; nBodyLength=nLength=15; */ char pBodyString[10],j=0; int nBodyLength,nLength; for(int i=0;i<14;i+=2) { pBodyString[j]=(szIn[i]-48)*16+szIn[i+1]-48; j++; } pBodyString[7]='+'; pBodyString[8]=0; pBodyString[9]=0; nBodyLength=nLength=10; int start = m_nPos; writeStream(pBodyString, nBodyLength); encodeLength(nLength); encodeTag(CASN1Tag::TAG_GENERALIZEDTIME, false); int end = m_nPos; nOutLength = end - start; return true; } bool CBEREncoder::encodeGraphicString(const char* szIn, int &nOutLength) { start(); return true; } bool CBEREncoder::encodeVisibleString(const char* szIn, int &nOutLength) { start(); return true; } bool CBEREncoder::encodeGeneralString(const char* szIn, int &nOutLength) { start(); return true; } bool CBEREncoder::encodeUniversalString(const char* szIn, int &nOutLength) { start(); return true; } bool CBEREncoder::encodeBMPString(const char* szIn, int &nOutLength) { start(); return true; } bool CBEREncoder::encodeStructure(const char* szIn, int nLength, int &nOutLength) { start(); return true; } bool CBEREncoder::enInteger(int nIn,char *&out) { int t,s; int nBodyLength,nLength; int j=0;//,l; // uInt; char strtemp[20]; char str[20]; char *pBodyString; sprintf(strtemp,"%x\0",nIn); strcpy(str,strtemp); if((strlen(strtemp)%2)==1) sprintf(str,"%d%s",0,strtemp);//sprintf(str,"%d%s\0",0,strtemp); nBodyLength=strlen(str)+1; pBodyString =new char[nBodyLength]; for(int k=0;k<strlen(str);k+=2){ if((str[k]>='A')&&(str[k]<='F')) t=str[k]-57; else if((str[k]>='a')&&(str[k]<='f')) t=str[k]-87; else if ((str[k+1]>='0')&&(str[k+1]<='9')) t=str[k]-48; else continue; if((str[k+1]>='A')&&(str[k+1]<='F')) s=str[k+1]-57; else if((str[k+1]>='a')&&(str[k+1]<='f')) s=str[k+1]-87; else if((str[k+1]>='0')&&(str[k+1]<='9')) s=str[k+1]-48; else continue; pBodyString[j++]=t*16+s; }; // pBodyString[j+1]='\0'; //nBodyLength=nLength=j; //nBodyLength=nLength=j; memcpy(out,pBodyString,j); delete []pBodyString; return true; } }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -