資源簡介
已經在vxworks上成功進行了編解碼測試。編解碼比較簡單,已經封裝好了編碼函數和解碼函數。大家可以稍加修改移植到你自己的平臺。
代碼片段和文件信息
#define?END????0xC0
#define?ESC????0xDB
#define?ESC_END????0xDC
#define?ESC_ESC????0xDD
#define?SLIP_OP_OK????0
#define?SLIP_ERROR_DST_LENGTH_SHORT????-1
#define?SLIP_ERROR_SRC_LENGTH_SHORT????-2
#define?SLIP_ERROR_FLAG_ERROR????-3
#include?
#include?
using?namespace?std;
int?Encapsulation(unsigned?char*?psrcbuf?int?srclen?unsigned?char*?pdstbuf?int?&dstlen)
{
unsigned?char*?ptembuf?=?new?unsigned?char[2*srclen];??/*定義一個數組ptembuf用于對源數據中元素的替換*/
/*替換源數據中的元素*/
for(int?i?=?0?j?=?0?count?=?0;?i? {
/*第一種假設替換m*/
if(psrcbuf[i]==END)
{
ptembuf[j]?=?ESC;
ptembuf[j?+?1]?=?ESC_END;
j?+=?1;
j++;
i++;
count++;
continue;
}
/*第二種實際的0xDB*/
if(psrcbuf[i]?==?ESC)
{
ptembuf[j]?=?ESC;
ptembuf[j?+?1]?=?ESC_ESC;
j?+=?2;
i++;
count++;
continue;
}
/*正常元素*/
else
{
ptembuf[j]?=?psrcbuf[i];
i++;
j++;
continue;
}
}????
/*不夠返回-1,結束程序*/
if(dstlen?(srclen?+?count?+?2))
{
return?SLIP_ERROR_DST_LENGTH_SHORT;
}
/*將ptembuf賦值給pdstbuf*/
else
{
dstlen?=?srclen?+?count?+?2;
pdstbuf[0]?=?END; /*以?x?為報文頭尾標志*/
pdstbuf[dstlen?-?1]?=?END;
for(int?k?=?1;?k?(srclen?+?count?+?1);?k++)
{
pdstbuf[k]?=?ptembuf[k?-?1];
}
ptembuf?=?0;
delete?[]?ptembuf;??/*釋放ptembuf內存*/
return?SLIP_OP_OK;
}
return?0;
}?
int?Dencapsulation(unsigned?char*?psrcbuf?int?srclen?unsigned?char*?pdstbuf?int?&dstlen)
{
int?count;
count?=?0;
/*報文標志錯誤返回-3*/
if(psrcbuf[0]?!=?END?||?psrcbuf[srclen?-?1]?!=?END)
{
return?SLIP_ERROR_FLAG_ERROR;
}
else
{
/*替換報文中的元素*/
for(int?i?=?1?j?=?0;?i?(srclen?-?1);)
{
if(psrcbuf[i]?==?ESC?&&?psrcbuf[i?+?1]?==?ESC_END)
{
pdstbuf[j]?=?END;
i?+=?2;
j++;
count++;
continue;
}
if(psrcbuf[i]?==?ESC?&&?psrcbuf[i?+?1]?==?ESC_ESC)
{
pdstbuf[j]?=?ESC;
i?+=?2;
j++;
評論
共有 條評論