PPP数据成帧转义,C语言实现
#include
#include
// PPP数据帧每一帧都以标识字符0x7E开始和结束;
// 由于标识字符的值是0x7E,因此当该字符出现在信息字段中时,PPP需要对它进行转义。
// 当PPP使用异步传输时,它把转义字符定义为:0x7D,并使用字节填充RFC-1662标准。
// 字节填充RFC-1662标准规定如下:
// 1. 把信息字段中出现的每一个0x7E字符转变成字节序列(0x7D,0x5E)
// 2. 若信息字段中出现一个0x7D的字节(即出现了与转义字符相同的比特组合),
// 则把0x7D转义成两个字节序列(0x7D,0x5D)
// 3. 若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),
// 则在该字符前面加入一个0x7D字节,同时将该字符的编码加以改变
#define PPP_FRAME_FLAG ( 0x7E ) /* 标识字符 */
#define PPP_FRAME_ESC ( 0x7D ) /* 转义字符 */
#define PPP_FRAME_ENC ( 0x20 ) /* 编码字符 */
int ppp_encode(unsigned char *in, int in_len, unsigned char *out, int *out_len)
{
unsigned char *pi, *po;
int i, tmp_len;
pi = in;
po = out;
tmp_len = in_len;
for(i = 0; i < in_len; i++)
{
if( *pi == PPP_FRAME_FLAG || *pi == PPP_FRAME_ESC || *pi < 0x20 )
{
*po = PPP_FRAME_ESC;
po++;
tmp_len++;
*po = *pi ^ PPP_FRAME_ENC;
}
else
{
*po = *pi;
}
pi++;
po++;
}
*out_len = tmp_len;
return 0;
}
int ppp_decode(unsigned char *in, int in_len, unsigned char *out, int *out_len)
{
unsigned char *pi, *po;
int i, tmp_len;
pi = in;
po = out;
tmp_len = in_len;
for(i = 0; i < in_len; i++)
{
if(*pi == PPP_FRAME_ESC)
{
pi++;
tmp_len--;
*po = *pi ^ PPP_FRAME_ENC;
i++;
}
else
{
*po = *pi;
}
pi++;
po++;
}
*out_len = tmp_len;
return 0;