这是小弟我写的一段组包的源码,请大家看看
这是我写的一段组包的源码,请大家看看?
//组装串口发过来的报文格式
char *SSjxlh = "136161203810381 "; //15位的手机序列号
char Data[10];
char DStr[20];
char DStrS[22];
int I;
for(I=0;I <8&&SSjxlh[I*2];I++)
{
if(SSjxlh[I*2+1])
{
Data[I] = SSjxlh[I*2]*10+SSjxlh[I*2+1];
}
else
{
Data[I] = SSjxlh[I*2];
I++;break;
}
} //转换成8位BCD码
Data[I] = 0;
Data[I+1] = 3; //在8位BCD码后加入“03”交易码
//对Data(共10位)进行加密
x_StrCryptUN(Data,10, "99 "); // "99 "为密钥,加密成10位
BinToHex(Data,DStr,I+2); //把Data由二进制转换成16进制,长度扩展为一倍,即20位
DStrS[0]= '9 ';
DStrS[1]= '9 ';
strcpy(DStrS+2,DStr); //在DStr前加上 "99 "两位密钥,组合成22位的固定报文
char *Sjy= "policeNum=32051234&searchDate=20060526& "; //http格式的报文-警员号+查询日期
int rlen;
rlen=strlen(Sjy);
AnsiString SBwmx= " ";
x_StrCryptUN(Sjy,rlen, "3204010123456789 "); //利用“3204010123456789”16位通讯密钥进行加密,长度不变
for (int j=0;j <rlen;j++)
{
SBwmx=SBwmx+IntToHex(Sjy[j],2); //转换成16进制,长度扩展为1倍
}
//把两串报文组合在一起
AnsiString SBwall;
SBwall=AnsiString(DStrS)+SBwmx;
//把该串报文组合成串口报文
//通讯序号设为 "0 "
//数据长度=通讯序号的长度(1)+报文的长度(求SBwall的长度)
int datalen;
AnsiString dataxh= "1 ";
datalen=SBwall.Length()+1; //求得数据长度(最大3位)
//对数据长度、通讯序号、报文数据进行组装,并进行校验运算
AnsiString DataMx;
DataMx=AnsiString(datalen)+dataxh+SBwall;
//校验 (对数据长度、通讯序号、报文数据的校验,也即对DataMx的校验)
unsigned char *CDataMx;
CDataMx=DataMx.c_str(); //把AnsiString类型字符串转换为char字符串
//组装串口发过来的报文格式
char *SSjxlh = "136161203810381 "; //15位的手机序列号
char Data[10];
char DStr[20];
char DStrS[22];
int I;
for(I=0;I <8&&SSjxlh[I*2];I++)
{
if(SSjxlh[I*2+1])
{
Data[I] = SSjxlh[I*2]*10+SSjxlh[I*2+1];
}
else
{
Data[I] = SSjxlh[I*2];
I++;break;
}
} //转换成8位BCD码
Data[I] = 0;
Data[I+1] = 3; //在8位BCD码后加入“03”交易码
//对Data(共10位)进行加密
x_StrCryptUN(Data,10, "99 "); // "99 "为密钥,加密成10位
BinToHex(Data,DStr,I+2); //把Data由二进制转换成16进制,长度扩展为一倍,即20位
DStrS[0]= '9 ';
DStrS[1]= '9 ';
strcpy(DStrS+2,DStr); //在DStr前加上 "99 "两位密钥,组合成22位的固定报文
char *Sjy= "policeNum=32051234&searchDate=20060526& "; //http格式的报文-警员号+查询日期
int rlen;
rlen=strlen(Sjy);
AnsiString SBwmx= " ";
x_StrCryptUN(Sjy,rlen, "3204010123456789 "); //利用“3204010123456789”16位通讯密钥进行加密,长度不变
for (int j=0;j <rlen;j++)
{
SBwmx=SBwmx+IntToHex(Sjy[j],2); //转换成16进制,长度扩展为1倍
}
//把两串报文组合在一起
AnsiString SBwall;
SBwall=AnsiString(DStrS)+SBwmx;
//把该串报文组合成串口报文
//通讯序号设为 "0 "
//数据长度=通讯序号的长度(1)+报文的长度(求SBwall的长度)
int datalen;
AnsiString dataxh= "1 ";
datalen=SBwall.Length()+1; //求得数据长度(最大3位)
//对数据长度、通讯序号、报文数据进行组装,并进行校验运算
AnsiString DataMx;
DataMx=AnsiString(datalen)+dataxh+SBwall;
//校验 (对数据长度、通讯序号、报文数据的校验,也即对DataMx的校验)
unsigned char *CDataMx;
CDataMx=DataMx.c_str(); //把AnsiString类型字符串转换为char字符串