#include <stdio.h>
#include <string.h> // 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 = ; 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 ;
} 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 = ; 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 ;
} void printf_hex(char *title, unsigned char *hex, int n)
{
int i; printf("%s", title);
for(i = ; i < n; i++)
{
if(i % == && i != )
printf("\r\n");
printf("%02x ", (unsigned char )hex[i]);
}
printf("\r\n");
} int main(void)
{
unsigned char p1[];
unsigned char p2[];
unsigned char p3[];
int i, len1, len2, len3; len1 = sizeof(p1)/sizeof(p1[]); for(i = ; i < len1; i++)
{
p1[i] = i % ;
} printf_hex("Before Encode::\r\n", p1, len1);
printf("Before Encode, len1: %d\r\n", len1); ppp_encode(p1, len1, p2, &len2); printf_hex("After Encode::\r\n", p2, len2);
printf("After Encode, len2: %d\r\n", len2); ppp_decode(p2, len2, p3, &len3); printf_hex("After Decode::\r\n", p3, len3);
printf("After Decode, len3: %d\r\n", len3); return ;
}

PPP 转义字符 编码 和 解码的更多相关文章

  1. Python编码与解码

    # -*- coding: utf-8 -*- # 直接保存为Python脚本,对照执行结果会好看点. # 实验的内容都是在Python 2.7.x下进行的. # Python3默认采用unicode ...

  2. java中的url 编码与解码

    什么是application/x-www-form-urlencoded字符串? 答:它是一种编码类型.当URL地址里包含非西欧字符的字符串时,系统会将这些字符转换成application/x-www ...

  3. Python中的编码与解码(转)

    Python中的字符编码与解码困扰了我很久了,一直没有认真整理过,这次下静下心来整理了一下我对方面知识的理解. 文章中对有些知识没有做深入的探讨,一是我自己也没有去深入的了解,例如各种编码方案的实现方 ...

  4. 从Python的角度来看编码与解码

    导语: Python2和Python3中,因为默认字符集的不同而造成的麻烦,简直是程序员的梦魇!要彻底告别这个麻烦,就需要从本质上来理解编码和解码. 为什么要有编码? 对于不会英文的中国人来说,将英文 ...

  5. python之编码与解码、is 与==的区别

    一.编码与解码 编码的过程其实就是采用一定的编码格式将unicode字符转换成str字符的过程 非ASCII码字符按字节为单位被编码成十六进制转义字符 解码采用的编码格式跟设置和环境有关 ascii ...

  6. java编码原理,java编码和解码问题

    java的编码方式原理 java的JVM的缺省编码方式由系统的“本地语言环境”设置确定,和操作系统的类型无关 . 在JAVA源文件-->JAVAC-->Class-->Java--& ...

  7. IO(六)--- 编码和解码

    编码: 把看得懂的字符变成看不懂码值这个过程我们称作为编码. 解码: 把码值查找对应的字符,我们把这个过程称作为解码. 注意: 以后编码与解码一般我们都使用统一的码表.否则非常容易出乱码. 常用码表: ...

  8. RapidJSON 代码剖析(三):Unicode 的编码与解码

    根据 RFC-7159: 8.1 Character Encoding JSON text SHALL be encoded in UTF-8, UTF-16, or UTF-32. The defa ...

  9. BASE64编码和解码(VC源代码) 并 内存加载 CImage 图像

      BASE64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本.完整的BASE64定义可见 RFC1421和 RFC2045.编码后的数据比原始数据略长,为原来的4/3.在电子 ...

随机推荐

  1. mongodb 使用场景和不使用场景

    1.mongodb介绍 MongoDB (名称来自"humongous") 是一个可扩展的高性能,开源,模式自由,面向文档的数据库.它使用C++编写.MongoDB特点: a.面向 ...

  2. Spring整合Ehcache管理缓存(转)

    目录 前言 概述 安装 Ehcache的使用 HelloWorld范例 Ehcache基本操作 创建CacheManager 添加缓存 删除缓存 实现基本缓存操作 缓存配置 xml方式 API方式 S ...

  3. tensor flow入门笔记

    个人学习笔记,欢迎交流.

  4. Linux学习 :按键信号 之 异步通知

    一.异步通知概念: 异步通知是指:一旦设备就绪,则主动通知应用程序,应用程序根本就不需要查询设备状态,类似于中断的概念,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进 ...

  5. python2.7安装scikit-learn遇到的问题及解决方法

    安装完matplotlib后,在运行scikit-learn相关的库的时候又遇到缺包的问题,本来以为缺什么包就装什么包,但是由于种种原因,使我走上了弯路: 第一个坑:学校校园网限制.我用scikit- ...

  6. 006 复杂的数据类型&函数(方法)

    2016-01-16 1.变量类型int double string char bool decimal变量的使用规则:先声明再赋值最后使用int number;number=10; number=2 ...

  7. C++之虚函数和多态

    干货较多-需要自己深思理解: C++支持两种多态性: 1.编译时多态性(静态绑定-早绑定) 在程序编译阶段即可以确定下来的多态性 通过使用 重载机制(重载函数)实现 (模板)http://blog.c ...

  8. Ext JS 4 老特征:statics 静态的变量和方法

    l   一.静态的变量和静态的方法 [译文原创Learning Ext JS 4 第51页] Statics的方法只属于类本身,而不属于任何一个实例,这就决定了我们是在定义类的内部来用statics方 ...

  9. 《SharePoint 2013 应用开发实战》目录

    博客地址:http://blog.csdn.net/FoxDave 第 1 章  1 ◄SharePoint概述►        1 1.1  SharePoint的发展历程 1 1.1.1  Sha ...

  10. 一定要在主线程更新UI

    在一些技术交流群里面,一些初学者(我表示我也是其中一人),总是会发现,为什么我UIView的animate方法,不会动!而是直接闪? 这是为什么呢? 一定要在主线程中更新UI! 一定要在主线程中更新U ...