⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svsccpcri.cpp

📁 七号信令解码器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"

#define NOPASS 0
#define PASS 0xff
#define BYTEOFPVAR 3

extern BYTE BUFSETMEM[];

extern BYTE compare(BYTE *code,BYTE *crit,BYTE floh);
extern BYTE compareaddr(BYTE *msg,BYTE *crit);
extern BYTE comparespcode(BYTE *msg,BYTE *crit);
extern BYTE compareDPC14(BYTE *msg,BYTE *crit);
extern BYTE compareOPC14(BYTE *msg,BYTE *crit);


BYTE compareSCCPDPC(BYTE *msg,BYTE *crit)
{

	 return (compare(msg,crit+2,0));
}
BYTE compareSCCPDPC14(BYTE *msg,BYTE *crit)
{ BYTE code[2];

	 code[0]=*(msg+1); //get SPCODE to code
	 code[1]=*(msg+2)&0x3f;

	 return (compare(&code[0],crit+2,0));
}

BYTE compareSCCPSSN(BYTE *msg,BYTE *crit)
{ BYTE code;

	 if(*msg&0x01) msg+=3;
	 code=*(msg+1);  //get SSN to code
	 return (compare(&code,crit+2,0));
}
BYTE compareSCCPSSN14(BYTE *msg,BYTE *crit)
{ BYTE code;

	 if(*msg&0x01) msg+=2;
	 code=*(msg+1);  //get SSN to code
	 return (compare(&code,crit+2,0));
}

BYTE compareSCCPADDR(BYTE *msg,BYTE *crit)
{ BYTE code,len;

  len=*msg++;             //get len &msg-->ADDIN
  code=*msg++;
  if(code&0x01) {msg+=3;len-=3;} //exist SPCODE
  if(code&0x02) {msg++;len--;}  //exist SSSN
  code&=0x3c;
  if(code==0x04||code==0x08)//GT1\GT2
	  {msg++;len--;}
  else if(code==0x0c)//GT3
	  {msg+=2;len-=2;}
  else if(code==0x10)//GT4
	  {msg+=3;len-=3;}
  else len=0;

  if(len!=0) return(compareaddr(msg,crit));
  else return NOPASS;
}

BYTE compareSCCPADDR14(BYTE *msg,BYTE *crit)
{ BYTE code,len;

  len=*msg++;             //get len &msg-->ADDIN
  code=*msg++;
  if(code&0x01) {msg+=2;len-=2;} //exist SPCODE
  if(code&0x02) {msg++;len--;}  //exist SSSN
  code&=0x3c;
  if(code==0x04||code==0x08)//GT1\GT2
	  {msg++;len--;}
  else if(code==0x0c)//GT3
	  {msg+=2;len-=2;}
  else if(code==0x10)//GT4
	  {msg+=3;len-=3;}
  else len=0;

  if(len!=0) return(compareaddr(msg,crit));
  else return NOPASS;
}

BYTE SCCPmesscri14(BYTE *bmsg,BYTE *crit)
{
  BYTE selecth1h0=0;
  BYTE fldno,numofbyte,varno,head;
  BYTE stat,code,*msg;

  do{
	fldno = *crit++;
	numofbyte=*(crit+3);
	if (fldno<=10)
	 switch (fldno)
	  {
		 case 7://DPC
		  msg=bmsg;
		  if (numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 if (BUFSETMEM[varno]!=*msg
				||BUFSETMEM[varno+1]!=(*(msg+1)&0x3f) )
			    stat=NOPASS;
			 crit +=5;  //crit-->OR(F7)/AND(F8)/CC
			}
		  else //compare with criteria
			{stat=compareDPC14(msg,crit);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			 crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 8://OPC
		  msg=bmsg+1;
		  if(numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 if( BUFSETMEM[varno]!=(*msg&0xc0)
				||BUFSETMEM[varno+1]!=*(msg+1)
				||BUFSETMEM[varno+2]!=(*(msg+2)&0x0f) )
				  stat=NOPASS;
			 crit +=5;     //crit-->OR/AND/0xaa
			}
		  else //compare with criteria
			{stat=compareOPC14(msg,crit);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			 crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 9://SLS
		  msg=bmsg+3;          //msg-->sls
		  if (numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 if (BUFSETMEM[varno]!=(*msg&0xf0)) stat=NOPASS;
			 crit +=5;     //crit-->OR/AND/0xaa
			}
		  else //compare with criteria
			{code=*(bmsg+3)&0xf0; code=code>>4;
			 stat=compare(&code,crit+2,0);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			 crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 10: //H1H0
		  selecth1h0=0xff;
		  head=code=*(bmsg+4);
		  stat=compare(&code,crit+2,0);
		  if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
		  crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
		  break;

		 default:stat=NOPASS; break;
	  }//switch
	 else if(selecth1h0)
	  {switch(head)
		{case 0x01://CR
		  msg=bmsg+11; //msg-->Option pointer
		  if(fldno==31 || fldno==32 || fldno==37)//select CLGPA
			{code=*msg++;  //get Option pointer
			 msg +=code;   //msg-->Option Name code
			 code=*msg++;   //get Option Name code,msg-->len
			 if(code==0x09)//exist credit:3byte
				msg+=3;     //msg-->next Option Name code
			 code=*msg++;   //get Option Name code,msg-->len
			 if(code!=0x04)//no CLGPA
			  {stat=NOPASS;break;}
			}//select CLGPA

		  if(fldno==18||fldno==31)//select DPC
			{ msg++;  //msg-->ADDRIN of CLDPA
			  if(*msg&0x01) stat=compareSCCPDPC(msg,crit); //exist DPC
			  else stat=NOPASS;
			}//select DPC
		  else if (fldno==19||fldno==32)//select SSN
			{ msg++;  //msg-->ADDRIN of CLDPA
			  if(*msg&0x02) stat=compareSCCPSSN(msg,crit); //exist DPC
			  else stat=NOPASS;
			}//select SSN
		  else if (fldno==24||fldno==37)//select ADDR
			{ if (*(msg+1)&0x04)
				 stat=compareSCCPADDR(msg,crit);//msg-->len
			  else stat=NOPASS;
			}//select ADDR
		  else stat=NOPASS;

		  break;

		 case 0x02://CC
		  msg=bmsg+13; //msg-->Option name code
		  if(fldno==22||fldno==23||fldno==28)
			{code=*msg++;   //get Option Name code,msg-->len
			 if(code==0x09)//exist credit:3byte
				msg+=3;     //msg-->next Option Name code
			 code=*msg++;   //get Option Name code,msg-->len
			 if(code!=0x03)//no CLDPA
			  {stat=NOPASS;break;}
			}

		  if(fldno==22)//select DPC
			{ msg++;  //msg-->ADDRIN of CLDPA
			  if(*msg&0x01) stat=compareSCCPDPC(msg,crit); //exist DPC
			  else stat=NOPASS;
			}//select DPC
		  else if (fldno==23)//select SSN
			{ msg++;  //msg-->ADDRIN of CLDPA
			  if(*msg&0x02) stat=compareSCCPSSN(msg,crit); //exist DPC
			  else stat=NOPASS;
			}//select SSN
		  else if (fldno==28)//select ADDR
			{ if (*(msg+1)&0x04)
				 stat=compareSCCPADDR(msg,crit);//msg-->len
			  else stat=NOPASS;
			}//select ADDR
		  else stat=NOPASS;

		  break;

		 case 0x03://CREF
		  msg=bmsg+11; //msg-->Option name code
		  if(fldno==17||fldno==18||fldno==23)
			{code=*msg++;   //get Option Name code,msg-->len
			 if(code==0x09)//exist credit:3byte
				msg+=3;     //msg-->next Option Name code
			 code=*msg++;   //get Option Name code,msg-->len
			 if(code!=0x03)//no CLDPA
			  {stat=NOPASS;break;}
			}

		  if(fldno==17)//select DPC
			{ msg++;  //msg-->ADDRIN of CLDPA
			  if(*msg&0x01) stat=compareSCCPDPC(msg,crit); //exist DPC
			  else stat=NOPASS;
			}//select DPC
		  else if (fldno==18)//select SSN
			{ msg++;  //msg-->ADDRIN of CLDPA
			  if(*msg&0x02) stat=compareSCCPSSN(msg,crit); //exist DPC
			  else stat=NOPASS;
			}//select SSN
		  else if (fldno==23)//select ADDR
			{ if (*(msg+1)&0x04)
				 stat=compareSCCPADDR(msg,crit);//msg-->len
			  else stat=NOPASS;
			}//select ADDR
		  else stat=NOPASS;

		  break;

		 case 0x09://field No of UDT:18,19,24,27,28,33
		 case 0x0a://field No of UDTS:17,18,23,26,27,32
		  fldno+=head;
		  msg=bmsg+10; //msg-->length of CLDPA(V)
		  if(fldno==37 || fldno==38 || fldno==43)//select CLGPA
			{code=*msg++;  //get length of CLDPA(V)
			 msg +=code;   //msg-->len of CLGPA(V)
			}//select CLGPA

		  if(fldno==28||fldno==37)//select DPC
			{ msg++;  //msg-->ADDRIN of CLDPA
			  if(*msg&0x01) stat=compareSCCPDPC(msg,crit); //exist DPC
			  else stat=NOPASS;
			}//select DPC
		  else if (fldno==29||fldno==38)//select SSN
			{ msg++;  //msg-->ADDRIN of CLDPA
			  if(*msg&0x02) stat=compareSCCPSSN(msg,crit); //exist DPC
			  else stat=NOPASS;
			}//select SSN
		  else if (fldno==34||fldno==43)//select ADDR
			{ if (*(msg+1)&0x04)
				 stat=compareSCCPADDR(msg,crit);//msg-->len
			  else stat=NOPASS;
			}//select ADDR
		  else stat=NOPASS;

		  break;


		 case 0x11://XUDT
		 case 0x12://XUDTS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -