📄 cbcbscpack.c
字号:
/* 以下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 + -