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

📄 cbcbscpack.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 3 页
字号:
	/* 以下2 tag,2 len 打包 */
	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;/* 包括Name sequence标签的整个包长 */

	i=i-lentmp;  //len
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       //tag
	Buf[i]=0xa0;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return Offset+lentmp;


/*
	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括Name 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=0xa0;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;
*/

}


/* PassWord
 * 返回偏移量 Error -1
 */
int pack_PassWord(PASSWORD_t *s_PassWord, char *ptr)
{
	unsigned char Buf[30];
	int           len;

	if (s_PassWord->clength>20)
		return FAILURE;

	Buf[0]=0x81;/* 上下文类 */
	Buf[1]=s_PassWord->clength;

	memcpy(&Buf[2],&s_PassWord->cPassword[0],s_PassWord->clength);
	len=Buf[1]+2;
	memcpy(ptr,&Buf[0],len);
	return len;
}


/* VERSION
 * 返回偏移量 Error -1
 */
int pack_Version(VERSION_t  *s_Version, char *ptr)
{
	unsigned char Buf[30];
	int           len;

	Buf[0]=0x82;//上下文类
	Buf[1]=1;
	Buf[2]=s_Version->cVersion;
	len=Buf[1]+2;
	memcpy(ptr,&Buf[0],len);
	return len;
}

/* 邦定操作打包
 * 返回偏移量 Error -1
 */
int Pack_cbse_VBIND(VBIND_t *s_Vbind,char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int Offset=0;               //PackBuf偏移指针

	
	/* Name */
	if (s_Vbind->p_Name.bFlag==1)
	{
		len=pack_Name(&s_Vbind->p_Name, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

    /* Password */
	if (s_Vbind->p_PassWord.bFlag==1)
	{
		len=pack_PassWord(&s_Vbind->p_PassWord, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

	/* Version */
/*	if (s_Vbind->p_Version.bFlag==1)
	{
		len=pack_Version(&s_Vbind->p_Version, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;
*/

	/* 以下2 tag,2 len 打包 */
	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;/* 包括VBIND sequence标签的整个包长 */

	i=i-lentmp;  /* len */
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       /* tag */
	Buf[i]=0x30;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;

/*	
	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括VBind 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=CBSE_VBIND;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;
*/
}

//打包参数Cell
int Pack_CELL(CELL_t *s_Cell,unsigned char *ptr)
{
	int len;
//	int lentmp;
//	unsigned char LenBuf[10];   //长度字段打包缓冲区
//	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[128];//打包缓冲区
	int Offset=0;               //PackBuf偏移指针

	memset(PackBuf,0,128);
	//CellIdDisc tag
    PackBuf[Offset]=4;
	Offset++;
	PackBuf[Offset]=1;
	Offset++;
	PackBuf[Offset]=s_Cell->cCellIdDisc;

	//CellId tag
	Offset++;
	PackBuf[Offset]=4;
	Offset++;
	PackBuf[Offset]=4;
	Offset++;
	memcpy(&PackBuf[Offset],&s_Cell->cCellId[0],4);
	Offset=Offset+4;

	*ptr=0x30;
	*(ptr+1)=Offset;
	memcpy((ptr+2),&PackBuf[0],Offset);

	len=Offset+2;

	return len;
}

//打包参数NOOFBROADCASTSCOML_t
//后向打包,最后偏移用Offset
int Pack_NO_OF_BROADCAST_COML(NOOFBROADCASTSCOML_t *s_NoOfBroadcastComl,unsigned char *ptr)
{
	int len;
	int lentmp;
	unsigned char CellBuf[64];
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int head=2048;
	int Offset=0;               //PackBuf偏移指针

	memset(PackBuf,0,2048);
	//大于1表示无该参数
	if (s_NoOfBroadcastComl->cNoOfBroadcastsComplType<=1)
	{
		head--;
		PackBuf[head]=s_NoOfBroadcastComl->cNoOfBroadcastsComplType;
		head--;
		PackBuf[head]=1;
		head--;
		//NoOfBroadcastsComplType tag
		PackBuf[head]=0x02;
	}

	len=ConvertToASN1Interger(s_NoOfBroadcastComl->iNoOfBroadcastsCompl ,&LenBuf[0]);
	head=head-len;
	memcpy(&PackBuf[head],LenBuf,len);


    len=Pack_CELL(&s_NoOfBroadcastComl->s_Cellid, &CellBuf[0]);
	head=head-len;
	memcpy(&PackBuf[head],CellBuf,len);

	len=2048-head;
//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括VBind 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=0x30;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[Offset],Offset);

	return len;

}


//打包参数NO_OF_BROADCAST_COMLLIST
int Pack_NO_OF_BROADCAST_COMLLIST(NOOFBROADCASTSCOMLLIST_t *s_NoOfBroadcastComlList,unsigned char *ptr)
{
	int j;
	int len;
	int lentmp;
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int Offset=0;               //PackBuf偏移指针

    memset(PackBuf,0,2048);

	for(j=0;j<s_NoOfBroadcastComlList->ilength;j++)
	{
		lentmp=Pack_NO_OF_BROADCAST_COML(&s_NoOfBroadcastComlList->s_NoOfBroadcastComl[j],&PackBuf[Offset]);
		if (lentmp<0)
			return FAILURE;
		Offset=Offset+lentmp;
	}

	len=Offset;
	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括VBind 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=0x60;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;

}

//打包FAILUREREPORT_t参数
//正向打包
int Pack_FAILURE_REPORT(FAILUREREPORT_t *s_FailureReport,unsigned char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int Offset=0;          	//PackBuf偏移指针

	memset(PackBuf,0,2048);

	//Cell
	len=Pack_CELL(&s_FailureReport->s_Cellid,&PackBuf[Offset]);
	Offset=Offset+len;

	//Cause
	//Cause tag
	PackBuf[Offset]=2;
	Offset++;
	PackBuf[Offset]=1;
	Offset++;
	PackBuf[Offset]=s_FailureReport->cCause;
	Offset++;

	//Diagnostic
	s_FailureReport->cDiagnostic[19]=0;
	len=strlen(&s_FailureReport->cDiagnostic[0]);
	if (len>0)
	{
		//tag
		PackBuf[Offset]=4;
    	Offset++;
    	PackBuf[Offset]=len;
    	Offset++;
    	memcpy(&PackBuf[Offset],&s_FailureReport->cDiagnostic[0],len);
    	Offset=Offset+len;
	}

	len=Offset;
	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括VBind 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=0x30;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;

}

//打包FAILURE_LIST参数
//正向打包
int Pack_FAILURE_LIST(FAILURELIST_t *s_FailureList,unsigned char *ptr)
{
	int j;
	int len;
	int lentmp;
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int Offset=0;               //PackBuf偏移指针

	memset(PackBuf,0,2048);

	for(j=0;j<s_FailureList->iLength;j++)
	{
		lentmp=Pack_FAILURE_REPORT(&s_FailureList->s_FailureReason[j],&PackBuf[Offset]);
		if (lentmp<0)
			return FAILURE;
		Offset=Offset+lentmp;
	}

	len=Offset;
	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括VBind 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=0x61;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;

}


//REPORT操作打包
int Pack_REPORT_SUCCESS(REPORTSUCCESS_t *s_ReportSuccess,unsigned char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];   //长度字段打包缓冲区
	unsigned char Buf[20];      //2Tag,2Len打包缓冲区 
	int i=20;                   //反向偏移指针
	unsigned char PackBuf[2048];//打包缓冲区
	int Offset=0;               //PackBuf偏移指针


	memset(PackBuf,0,2048);

	//MessageIdentifier
	if (s_ReportSuccess->p_MessageIdentifier.bFlag==1)
	{		
		len=Pack_MessageIdentifier(s_ReportSuccess->p_MessageIdentifier.iMessageIdentifier,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

    //Serialnumber
	if (s_ReportSuccess->p_Serialnumber.bFlag==1)
	{		
		len=Pack_SerialNumber(s_ReportSuccess->p_Serialnumber.iSerialNumber,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;


	//no-of-Broadcasts-Compl-List(O)
	if (s_ReportSuccess->p_NoofBroadcastComlList.bFlag==1)
	{		
		len=Pack_NO_OF_BROADCAST_COMLLIST(&s_ReportSuccess->p_NoofBroadcastComlList,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

	//FailureReportList(O)
	if (s_ReportSuccess->p_FailureReportList.bFlag==1)
	{		
		len=Pack_FAILURE_LIST(&s_ReportSuccess->p_FailureReportList,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

	//ChannelIndicator (O)
	if (s_ReportSuccess->p_ChannelIndicator.bFlag==1)
	{
        len=Pack_CHANNELINDICATOR(s_ReportSuccess->p_ChannelIndicator.cChannelIndicator, &PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}

	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;//包括KillMessage sequence标签的整个包长

	i=i-lentmp;  //len
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       //tag
	Buf[i]=0x30;

	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括KillMessage 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=CBSE_REPORT_SUCCESS;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return len;

}

//重置请求
int Pack_RESET(RESET_t *s_Reset,unsigned char *ptr)
{
	int len;
	int lentmp;
	unsigned char LenBuf[10];
	unsigned char Buf[20];
	int i=20;
	unsigned char PackBuf[2048];
	int Offset=0;
	

	memset(PackBuf,0,2048);
	
	//p_CellList
	if (s_Reset->p_CellList.bFlag==1)
	{
		len=Pack_CELLLIST(&s_Reset->p_CellList,&PackBuf[Offset]);
		if (len==FAILURE)
			return FAILURE;
		Offset=Offset+len;
	}else
		return FAILURE;

	lentmp=CovertASN1LEN(Offset,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=Offset+lentmp+1;//包括Reset sequence标签的整个包长

	i=i-lentmp;  //len
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;       //tag
	Buf[i]=CBSE_RESET;

	lentmp=20-i;

/*
	//
	lentmp=CovertASN1LEN(len,&LenBuf[0]);
	if (lentmp==FAILURE)
		return FAILURE;
	len=len+lentmp+1;//包括reset 上下文标签的整个包长
	i=i-lentmp;
	memcpy(&Buf[i],&LenBuf[0],lentmp);
	i--;
	Buf[i]=CBSE_RESET;

	lentmp=20-i;

	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

    return len;
*/
	memcpy(ptr,&Buf[i],lentmp);
	memcpy((ptr+lentmp),&PackBuf[0],Offset);

	return Offset+lentmp;

}

⌨️ 快捷键说明

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