ppp协议编码与解码

更新时间:2023-05-12 10:20:02 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ppp协议编码与解码

编码就是按照前面所说的对需要转义的字符进行变换,下面是简单的实现代码: 001 #define PPP_FRAME_FLAG 0x7e /* 标志字符 */

002 #define PPP_FRAME_ESC 0x7d /* 转义字符 */

003 #define PPP_FRAME_ENC 0x20 /* 编码字符 */

004 #define BUF_LEN 1500

005 /* return: bytes encoded */

006 int pppEncode(unsigned char * buf, int len) {

007 unsigned char * pi, * po;

008 int i, olen;

009 unsigned char obuf[BUF_LEN];

010 if(len > (BUF_LEN>>1)) {

011 return -1;

012 }

013 memset(obuf, 0, BUF_LEN);

014 pi = buf;

015 po = obuf;

016 olen = len;

017 for(i=0; i<len; i++) {

018 /* byte needs encode, encode it */

019 if(*pi == PPP_FRAME_FLAG

020 || *pi == PPP_FRAME_ESC

021 || *pi < 0x20) {

022 *po = PPP_FRAME_ESC;

023 po++;

024 olen++;

025 /* xor the 6th bit */

026 *po = *pi ^ PPP_FRAME_ENC;

027 }

028 else {

029 *po = *pi;

030 }

031 pi++;

032 po++;

033 }

034 memcpy(buf, obuf, olen);

035 return olen;

036 }

001~003: 定义标志字符,转义字符和编码字符。

010~012: 检查要编码的字符长度,按最坏情况,一个字符会编码成两个字符,所以这里只能编码最大缓冲区长度一半。

018~027: 编码的主要实现,遇到标志字符,转义字符和小于0x20的控制字符,都要进行编码。方法就是在其前面插入一个转义字符0x7d,然后对其第6位取补码。

028~030: 其他字符,不做任何修改。

034~035: 修改缓冲区,返回编码后的字符长度。

ppp协议编码与解码

解码实际上就是编码的逆运算,它除去转义字符,并对转义字符之后的字符的第6位去补码。 001 /* return: bytes decoded */

002 int pppDecode(unsigned char * buf, int len) {

003 unsigned char * pi, *po;

004 int i, olen;

005 unsigned char obuf[BUF_LEN];

006 if(len > BUF_LEN) {

007 return -1;

008 }

009 memset(obuf, 0, BUF_LEN);

010 pi = buf;

011 po = obuf;

012 olen = len;

013 for(i=0; i<len; i++) {

014 if(*pi == PPP_FRAME_ESC) {

015 /* skip the escape byte */

016 pi++;

017 olen--;

018 /* xor the 6th bit */

019 *po = *pi ^ PPP_FRAME_ENC;

020 }

021 else {

022 *po = *pi;

023 }

024 pi++;

025 po++;

026 }

027 memcpy(buf, obuf, olen);

028 return olen;

029 }

006~008: 检查要解码的字符长度。

014~020: 解码的主要实现,遇到转义字符,将其跳过,对紧接其后的字符的第6位去补码。

021~023: 其他字符,不做处理。

027~028: 修改缓冲区,返回解码后的字符长度。

本文来源:https://www.bwwdw.com/article/ya8e.html

Top