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

📄 svinapdisp.cpp

📁 七号信令解码器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*****************************************************
Update History:

2000.06.14:增加防范措施
******************************************************/
#include "stdafx.h"
#include <windows.h>

extern unsigned char *dispbuf,*recbuf;
extern unsigned char UDTlen;
extern unsigned short displen;


extern void procSourcePARAdisp(BYTE dfldno);
extern void procNULL(unsigned char dfldno);
extern char procsequencetag(unsigned char dfldno);
extern void procsbasicpara(unsigned char dfldno);
extern void procmoredatadisp(WORD len);

void procinteger(BYTE dfldno)
{ BYTE li;
	*dispbuf++=dfldno;  //tag
	*dispbuf++=8;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	
	*dispbuf++=dfldno+1;  //li
	*dispbuf++=8;
	li=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	
	*dispbuf++=dfldno+2;  
	*dispbuf++=li*8;
	if(li==1) *dispbuf++=*recbuf++;
	else if(li==2)
	{*dispbuf++=*(recbuf+1);
	 *dispbuf++=*recbuf;
	 recbuf+=2;
	}
	else if(li==3)
	{*dispbuf++=*(recbuf+2);
	 *dispbuf++=*(recbuf+1);
	 *dispbuf++=*recbuf;
	 recbuf+=3;
	}
	else if(li==4)
	{*dispbuf++=*(recbuf+3);
	 *dispbuf++=*(recbuf+2);
	 *dispbuf++=*(recbuf+1);
	 *dispbuf++=*recbuf;
	 recbuf+=4;
	}
	*dispbuf++=0xcc;
	displen+=li+11;
}

void procCase(BYTE dfldno)
{ BYTE li;
	*dispbuf++=dfldno;  //tag
	*dispbuf++=8;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	
	*dispbuf++=dfldno+1;  //li
	*dispbuf++=8;
	li=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	
	if((*recbuf&0x80)==0) {recbuf+=2;li-=2;}  //expand
	else {recbuf++;li--;}

	*dispbuf++=dfldno+2;  
	*dispbuf++=8;
	*dispbuf++=(*recbuf)&0x7f;
	recbuf+=li;
	*dispbuf++=0xcc;
	displen+=12;
}




void procINAPCHGADDR(unsigned char dfldno) //P49-50
{  unsigned char li,i,code;
//ADDR TAG
	*dispbuf++=dfldno;
	*dispbuf++=8;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//ADDR LI
	*dispbuf++=dfldno+1;
	*dispbuf++=8;
	li=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	UDTlen-=li+2;
//ADDR IN
	*dispbuf++=dfldno+2;
	*dispbuf++=8;
	code=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//ADDR SIGNAL
	if((code&0x7f)==9)
	{
	 *dispbuf++=dfldno+3;
	 *dispbuf++=32;
	 for(i=0;i<2;i++)
	 {*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
	 *dispbuf++=0xcc;
	 recbuf+=li-3;
	}
	else if((code&0x7f)==10)
	{
	 *dispbuf++=dfldno+3;
	 *dispbuf++=11*4;
	 for(i=0;i<6;i++)
	 {*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
	 *dispbuf++=0xcc;
	 recbuf+=li-7;
	}
	else
	{li--;
	 *dispbuf++=dfldno+3;
	 if((code&0x80)==0x80)  //there is fill,odd
		*dispbuf++=li*8-4;
	 else *dispbuf++=li*8;
	 for(i=0;i<li;i++)
	 {*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
	 *dispbuf++=0xcc;
	 displen+=li+15; //li*2+22;
	}//else
}


void procINAPADDR(unsigned char dfldno) //P49-50
{  unsigned char li,i,code;
//ADDR TAG
	*dispbuf++=dfldno;
	*dispbuf++=8;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//ADDR LI
	*dispbuf++=dfldno+1;
	*dispbuf++=8;
	li=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	UDTlen-=li+2;
//ADDR IN
	*dispbuf++=dfldno+2;
	*dispbuf++=8;
	code=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//ADDR SIGNAL
	li-=2;
	recbuf++;
	*dispbuf++=dfldno+3;
	if((code&0x80)==0x80)  //there is fill,odd
		*dispbuf++=li*8-4;
	else *dispbuf++=li*8;
	for(i=0;i<li;i++)
	{*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
	*dispbuf++=0xcc;
	displen+=li+15; //li*2+22;
}



void ProcAdditionalCharg(BYTE dfldno)
{ BYTE indeffmt;

	indeffmt=procsequencetag(dfldno); //附加费 sequence
	procsbasicpara(dfldno+2);	//附加费值
	procsbasicpara(dfldno+5);	//附加费类型
	if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}

void ProcAdjustRate(BYTE dfldno)
{ BYTE indeffmt;

	indeffmt=procsequencetag(dfldno); //计费调整率 sequence
	procsbasicpara(dfldno+2);	//计费调整率值
	procsbasicpara(dfldno+5);	//计费调整率类型
	if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}


void procBearer(BYTE dfldno) //承载者
{  BYTE li,i,code;
//承载者 TAG
	*dispbuf++=dfldno;
	*dispbuf++=8;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//承载者 LI
	*dispbuf++=dfldno+1;
	*dispbuf++=8;
	li=*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
	UDTlen-=li+2;
//承载者的选择
	*dispbuf++=dfldno+2;
	*dispbuf++=8;
	*dispbuf++=*recbuf++;
	*dispbuf++=0xcc;
//承载者ID
	code=*recbuf++;
	li-=3;
	*dispbuf++=dfldno+3;
	*dispbuf++=code*4;
	code/=2;code++;
	for(i=0;i<code;i++) *dispbuf++=*(recbuf+i);
	*dispbuf++=0xcc;
	recbuf+=li;

	displen+=code+12;
}

void procLegID(BYTE dfldno)
{ BYTE indeffmt;
    indeffmt=procsequencetag(dfldno); //LEGID sequence
	if((*recbuf&0x3f)==0) procsbasicpara(dfldno+2); //发方ID
	else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+5); //收方ID
	if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}	  
}

void ProcSendingInfo(BYTE dfldno,BYTE dfldno2) //要发送的信息
{ BYTE indeffmt0,indeffmt,indeffmt2,indeffmt3,indeffmt4,li,len;

	indeffmt0=procsequencetag(dfldno2); //要发送的信息 sequence
//“要发送的信息”选择“带内信息”“信号音”“显示信息”
	if((*recbuf&0x3f)==0x20)//选择“带内信息”
	{indeffmt=procsequencetag(dfldno); //带内信息 sequence
//“消息ID”选择“基本消息ID”“文本”“基本消息ID组”“可变消息”
	if((*recbuf&0x3f)==0x20)//“消息ID”
	{indeffmt2=procsequencetag(dfldno+2); //消息ID sequence
	 if((*recbuf&0x3f)==0) procsbasicpara(dfldno+4);  //基本消息ID
	 else if((*recbuf&0x3f)==0x21) //“文本”
	 {indeffmt3=procsequencetag(dfldno+7); //文本 sequence
	  if((*recbuf&0x3f)==0) procsbasicpara(dfldno+9); //消息内容
	  if((*recbuf&0x3f)==1) procsbasicpara(dfldno+12); //属性
	  if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
	 }//“文本”
	 else if((*recbuf&0x3f)==0x3d) //“基本消息ID组”
	 {indeffmt3=procsequencetag(dfldno+13); //基本消息ID组
	  while((*recbuf&0x3f)==2) procsbasicpara(dfldno+4); //基本消息ID
	  if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
	 }//“基本消息ID组”
	 else if((*recbuf&0x3f)==0x3e) //“可变消息”
	 {indeffmt3=procsequencetag(dfldno+17); //可变消息sequence
	  if((*recbuf&0x3f)==0) procsbasicpara(dfldno+4); //基本消息ID
	  if((*recbuf&0x3f)==0x21)//可变部分
	  {if(*(recbuf+1)<=0x80) li=*(recbuf+1);
	   else li=*(recbuf+2);
	   indeffmt4=procsequencetag(dfldno+19); //可变部分sequence
	   if(indeffmt4!=0)//indefinite formatt
	   {
		while(*(WORD *)recbuf!=0)
		{
		 if((*recbuf&0x3f)==0) procsbasicpara(dfldno+21); //整数
		 else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+24); //数字
		 else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+27); //时间
		 else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+30); //日期
		 else if((*recbuf&0x3f)==4) procsbasicpara(dfldno+33); //价格
		 else
		 {
			 procmoredatadisp(UDTlen); //add by 2000.06.14
			 UDTlen = 0;
			 return;
		 }
		}//while
		recbuf+=2;UDTlen-=2;
	   }//indefinite formatt
	   else//short\long format
	   {
		while(li!=0)
		{len=UDTlen;
		 if((*recbuf&0x3f)==0) procsbasicpara(dfldno+21); //整数
		 else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+24); //数字
		 else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+27); //时间
		 else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+30); //日期
		 else if((*recbuf&0x3f)==4) procsbasicpara(dfldno+33); //价格
		 
		 if(len>UDTlen)
		 {len-=UDTlen; li-=len;}
		 else
		 {
			 procmoredatadisp(UDTlen); //add by 2000.06.14
			 UDTlen = 0;
			 return;
		 }
		}//while
	   }//short\long format
	  }//可变部分
	  if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
	 }//“可变消息”
	 if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
	}////“消息ID”
//重复次数
	 if((*recbuf&0x3f)==1) procsbasicpara(dfldno+36); //重复次数
//持续时间
	 if((*recbuf&0x3f)==2) procsbasicpara(dfldno+39); //持续时间
//时间间隔
	 if((*recbuf&0x3f)==3) procsbasicpara(dfldno+42); //时间间隔
	 if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
	}//选择“带内信息”
	else if((*recbuf&0x3f)==0x21)//选择“信号音”
	{indeffmt=procsequencetag(dfldno+45);  //信号音 sequence
	 if((*recbuf&0x3f)==0) procsbasicpara(dfldno+47); //信号音ID
	 if((*recbuf&0x3f)==1) procsbasicpara(dfldno+39); //持续时间
	 if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
	}//选择“信号音”
	else if((*recbuf&0x1f)==2) //选择“显示信息”
	   procsbasicpara(dfldno+50);

	if(indeffmt0!=0) {recbuf+=2;UDTlen-=2;}
}


void ProcExpand(BYTE dfldno) //“扩展”,P63
{ BYTE indeffmt,indeffmt2;
	indeffmt=procsequencetag(dfldno); //扩展 sequence
	while(*recbuf==0x30 && UDTlen>2 && UDTlen<255)//扩展域
	{indeffmt2=procsequencetag(dfldno+2);//扩展域 sequence
	 procsbasicpara(dfldno+4);            //类型
	 procsbasicpara(dfldno+7);         //准则
	 procsbasicpara(dfldno+10);        //值
	 if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
	}//扩展域
	if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}


void procResourceID(BYTE dfldno)//"资源ID"
{ BYTE indeffmt,indeffmt2;

	indeffmt=procsequencetag(dfldno); // 资源ID sequence
//"资源ID"选择“设备群ID”“设备群成员ID”“中继群ID”
	if((*recbuf&0x3f)==0x21)//选择“设备群ID”
	{indeffmt2=procsequencetag(dfldno+2); // 设备群ID sequence
	 if((*recbuf&0x3f)==0) procsbasicpara(dfldno+4); //选择“中继群ID”
	 else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+7); //选择“单个设备ID”
	 else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+10); //选择“搜索群”
	 else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+13); //选择“路由索引”

	 if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
	}//选择“设备群ID”
	else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+16);  //设备群成员ID
	else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+19);  //中继群ID

	if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}

void procINAPdisp(BYTE oc,BYTE compt)
{  BYTE indeffmt,indeffmt2,indeffmt3,indeffmt4,li,len;

⌨️ 快捷键说明

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