C语言7e 10,0x7e相关转义

本文介绍了PPP数据成帧转义的原理,包括C语言的转义和解转义函数实现,以及相应的Java实现。内容涵盖PPP协议在异步传输中对0x7E和0x7D字符的处理方式,以及ASCII码控制字符的处理规则。
摘要由CSDN通过智能技术生成

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值