这是我写的一段组包的源码,请大家看看?
//组装串口发过来的报文格式
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字符串
int CDataMxLen;
CDataMxLen=strlen(CDataMx);
unsigned char ch;
ch=0;
int k;
for (k=0;k <CDataMxLen;k++)
ch=ch^CDataMx[k]; //计算校验位,1位
CDataMx[k]=ch; //加上校验位后的char字符串
//校验成功后合并串口报文,前面加0x02,后面加0x03
char *CDataMxZ=new char[1024];
CDataMxZ[0]= '0x02 ';
strcpy((char *)&CDataMxZ[1],CDataMx);
int CLen;
CLen=strlen(CDataMxZ);
CDataMxZ[CLen]= '0x03 ';
//1.对报文CDataMxz的头、尾进行解析,如发现头为0x02,尾为0x03则正确
int len;
len=strlen(ReccMx);
待做中.....
[解决办法]
什么问题?