ppp协议编码与解码
时间:2026-01-20
时间:2026-01-20
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: 修改缓冲区,返回编码后的字符长度。