计算协议长度
在协议中,组建内容需要得到协议内容的长度。如果在长度写入固定的值,那么修改内容之后也要相应的修改长度。那么如何通过程序自动得到长度值呢?
u8 子函数
{
u8 hex_len = 0;
u8 transBuf[4] = {0},lastBuf[4] = {0};
u16 len = 0,ls_dd = 0,dlen = 0;
dlen = len;
buf[len++] = 0x00; //长度高位先写0
buf[len++] = 0x00; //长度低位先写0
buf[len++] = ....... //协议内容
......
ls_dd = len - dlen + 2; //需要计算的长度 (这里不能硬抄,要根据实际情况)
hex_len = change_DEC_to_HEX(ls_dd,transBuf); //将10进制转为16进制数组,并得到16进制长度
char_string_right(transBuf,hex_len,lastBuf,2); //右对齐
buf[dlen] = lastBuf[0]; //赋计算出来的长度值hex 高位
buf[dlen + 1] = lastBuf[1]; //赋计算出来的长度值hex 低位
return len;
}
u8 change_DEC_to_HEX(u32 dec,u8 *h_buff)
{
int i = 0,len = 0;
//得到hex长度
if(dec < 255)
len = 1;
else if(dec < 65535)
len = 2;
else if(dec < 16777215)
len = 3;
else if(dec <= 4294967294)
len = 4;
else
len = 0;
for(i = 0;i < len;i++)
{
h_buff[i] = dec >> (8 * (len - 1 - i));
}
return len;
}
void char_string_right(unsigned char *s_chr,unsigned int s_len,unsigned char *t_chr,int t_len){
int i = 0,tw = 0,sw = 0;
if(s_len == 0){
for(i = 0;i < t_len;i++)
t_chr[i] = 0;
return;
}
tw = t_len - 1;
sw = s_len - 1;
for(i = 0;i < s_len;i++){ //右对齐
t_chr[tw --] = s_chr[sw -- ];
}
tw = t_len - s_len; //左侧补零
for(i = 0;i < tw;i++){
t_chr[i] = 0;
}
}