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;

}

void printf_hex(char *title, unsigned char *hex, int n)

{

int i;

printf("%s", title);

for(i = 0; i < n; i++)

{

if(i % 16 == 0 && i != 0)

printf("\r\n");

printf("%02x ", (unsigned char )hex[i]);

}

printf("\r\n");

}

int main(void)

{

unsigned char p1[256];

unsigned char p2[512];

unsigned char p3[512];

int i, len1, len2, len3;

len1 = sizeof(p1)/sizeof(p1[0]);

for(i = 0; i < len1; i++)

{

p1[i] = i % 256;

}

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 0;

}

PPP数据成帧转义,JAVA语言实现

private static final char PPP_FRAME_FLAG = 0x7E;

private static final char PPP_FRAME_ESC = 0x7D;

private static final char PPP_FRAME_ENC = 0x20;

// PPP数据帧每一帧都以标识字符0x7E开始和结束;

// 由于标识字符的值是0x7E,因此当该字符出现在信息字段中时,PPP需要对它进行转义。

// 当PPP使用异步传输时,它把转义字符定义为:0x7D,并使用字节填充RFC-1662标准。

// 字节填充RFC-1662标准规定如下:

// 1. 把信息字段中出现的每一个0x7E字符转变成字节序列(0x7D,0x5E)

// 2. 若信息字段中出现一个0x7D的字节(即出现了与转义字符相同的比特组合),

// 则把0x7D转义成两个字节序列(0x7D,0x5D)

// 3. 若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),

// 则在该字符前面加入一个0x7D字节,同时将该字符的编码加以改变

public static char[] ppp_encode(char[] in) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < in.length; i++) {

if (in[i] == PPP_FRAME_FLAG || in[i] == PPP_FRAME_ESC || in[i] < 0x20) {

sb.append((char) PPP_FRAME_ESC);

sb.append((char) (in[i] ^ PPP_FRAME_ENC));

} else {

sb.append(in[i]);

}

}

char[] out = sb.toString().toCharArray();

return out;

}

// PPP数据帧每一帧都以标识字符0x7E开始和结束;

// 由于标识字符的值是0x7E,因此当该字符出现在信息字段中时,PPP需要对它进行转义。

// 当PPP使用异步传输时,它把转义字符定义为:0x7D,并使用字节填充RFC-1662标准。

// 字节填充RFC-1662标准规定如下:

// 1. 把信息字段中出现的每一个0x7E字符转变成字节序列(0x7D,0x5E)

// 2. 若信息字段中出现一个0x7D的字节(即出现了与转义字符相同的比特组合),

// 则把0x7D转义成两个字节序列(0x7D,0x5D)

// 3. 若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),

// 则在该字符前面加入一个0x7D字节,同时将该字符的编码加以改变

public static char[] ppp_decode(char[] in) {

printHex(in);

StringBuffer sb = new StringBuffer();

for (int i = 0; i < in.length; i++) {

if (in[i] == PPP_FRAME_ESC) {

sb.append((char)(in[i+1] ^ PPP_FRAME_ENC));

i++;

} else {

sb.append(in[i]);

}

}

char[] out = sb.toString().toCharArray();

printHex(out);

return out;

}

串口数据成帧转义,C语言实现

/*

* 0x7e 转义

* 0x7e = 0x7f 01

* 0x7f = 0x7f 02

*/

int mark_7e_encode(unsigned char *in, int in_len, unsigned char *out, int *out_len);

/*

* 0x7e 反转义

* 0x7e = 0x7f 01

* 0x7f = 0x7f 02

*/

int mark_7e_decode(unsigned char *in, int in_len, unsigned char *out, int *out_len);

#define MARK_7E ( 0x7E ) /* 标识字符 */

#define MARK_7F ( 0x7F ) /* 转义字符 */

#define MARK_01 ( 0x01 ) /* 转义字符 */

#define MARK_02 ( 0x02 ) /* 转义字符 */

int mark_7e_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 == MARK_7E )

{

*po = MARK_7F;

*(++po) = MARK_01;

tmp_len ++;

}

else if(*pi == MARK_7F){

*po = MARK_7F;

*(++po) = MARK_02;

tmp_len ++;

}

else

{

*po = *pi;

}

pi++;

po++;

}

*out_len = tmp_len;

return 0;

}

int mark_7e_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 == MARK_7F) && (*(pi + 1) == MARK_01))

{

*po = MARK_7E;

po++;

pi +=2;

tmp_len--;

i++;

}else if((*pi == MARK_7F) && (*(pi +1) == MARK_02)){

*po = MARK_7F;

po++;

pi +=2;

tmp_len--;

i++;

}

else

{

*po = *pi;

pi++;

po++;

}

}

*out_len = tmp_len;

return 0;

}

void printf_hex(char *title, unsigned char *hex, int n)

{

int i;

printf("%s", title);

for(i = 0; i < n; i++)

{

if(i % 16 == 0 && i != 0)

printf("\r\n");

printf("%02x ", (unsigned char )hex[i]);

}

printf("\r\n");

}

int main(void)

{

unsigned char p1[256];

unsigned char p2[512];

unsigned char p3[512];

int i, len1, len2, len3;

len1 = sizeof(p1)/sizeof(p1[0]);

for(i = 0; i < len1; i++)

{

p1[i] = i % 256;

}

printf_hex("Before Encode::\r\n", p1, len1);

printf("Before Encode, len1: %d\r\n", len1);

mark_7e_encode(p1, len1, p2, &len2);

printf_hex("After Encode::\r\n", p2, len2);

printf("After Encode, len2: %d\r\n", len2);

mark_7e_decode(p2, len2, p3, &len3);

printf_hex("After Decode::\r\n", p3, len3);

printf("After Decode, len3: %d\r\n", len3);

return 0;

}

串口数据成帧转义,JAVA语言实现

private static final char MARK_7E = 0x7E;

private static final char MARK_7F = 0x7F;

private static final char MARK_01 = 0x01;

private static final char MARK_02 = 0x02;

public static char[] mark_7e_encode(char[] in) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < in.length; i++) {

if (in[i] == MARK_7E) {

sb.append((char) MARK_7F);

sb.append((char) MARK_01);

} else if (in[i] == MARK_7F) {

sb.append((char) MARK_7F);

sb.append((char) MARK_02);

} else {

sb.append(in[i]);

}

}

char[] out = sb.toString().toCharArray();

return out;

}

public static char[] mark_7e_decode(char[] in) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < in.length; i++) {

if ((in[i] == MARK_7F) && (in[i + 1] == MARK_01)) {

sb.append((char) MARK_7E);

i++;

} else if ((in[i] == MARK_7F) && (in[i + 1] == MARK_02)) {

sb.append((char) MARK_7F);

i++;

} else {

sb.append(in[i]);

}

}

char[] out = sb.toString().toCharArray();

return out;

}

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

  1. Algorithm:C++语言实现之链表相关算法(链表相加、链表的部分翻转、链表划分、链表去重、重复元素全部删除)

    Algorithm:C++语言实现之链表相关算法(链表相加.链表的部分翻转.链表划分.链表去重.重复元素全部删除) 目录 一.链表 1.1.链表相加 1.2.链表相加 2.1.链表的部分翻转 2.2. ...

  2. 刁肥宅手笔:纯C语言实现栈的相关操作

    有一种爱不解释--我爱C语言! /*Name:纯C语言实现栈的相关操作Copyright:欢迎共享此代码Author:刁肥宅Date: 04/08/18 21:55Description:调试过程出行 ...

  3. Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)

    Algorithm:C+语言实现之数组相关算法(和为定值的两个数.和为定值的m个数.荷兰国旗.长度为2n的洗牌算法.任意长度数组的洗牌算法) 目录 数组 1.寻找和为定值的两个数 2.和为定值的m个数 ...

  4. Algorithm:C++语言实现之队列相关算法(最短路径条数问题、拓扑排序)

    Algorithm:C++语言实现之队列相关算法(最短路径条数问题.拓扑排序) 目录 队列 1.最短路径条数问题 2.拓扑排序 队列 1.最短路径条数问题

  5. Algorithm:C++语言实现之链表相关算法(单链公共结点问题、一般LCA、括号匹配、最长括号匹配、逆波兰表达式Reverse Polish Notation、直方图矩形面积、收集雨水问题)

    Algorithm:C++语言实现之链表相关算法(单链公共结点问题.一般LCA.括号匹配.最长括号匹配.逆波兰表达式Reverse Polish Notation.直方图矩形面积.收集雨水问题) 目录 ...

  6. Algorithm:C++语言实现之概率算法相关问题(计算机中的概率事件、C语言中的随机事件、产生二维随机数、圆内均匀取点)

    Algorithm:C++语言实现之概率算法相关问题(计算机中的概率事件.C语言中的随机事件.产生二维随机数.圆内均匀取点) 目录 一.概率 1.计算机中的概率事件 1.1.C语言中的随机事件 1.2 ...

  7. Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)

    Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...

  8. c语言参数传入函数赋值后传出来,c语言第10次实验内容函数2邹显春.ppt

    c语言第10次实验内容函数2邹显春 * #include void call(int, double, double);//使用函数前需要声明 double addition(double,doubl ...

  9. c语言输入10个数从小,C语言中,从键盘输入10个数,从小到大排列输出,怎

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:C语言中,从键盘输入10个数,从小到大排列输出,怎么写啊,最好注回答:#includestdio.h void swap(int * ...

最新文章

  1. EEPW单片机C语言程序设计,基于CH340T的STC89C52RC编程器设计
  2. 最长上升子序列(LIS)长度及其数量
  3. TestNG 自动化测试入门教程--典型示例
  4. ant design pro 加载慢_ant design pro项目打包后页面加载缓慢
  5. 征战蓝桥 —— 2014年第五届 —— C/C++A组第1题——猜年龄
  6. RecycleView的正确打开方式
  7. P4321-随机漫游【状压dp,数学期望,高斯消元】
  8. ROS入门笔记(四):ROS实践(小海龟仿真)— ROS Topics
  9. UI设计干货素材|简单素材模板教你分分钟提高UI设计水平!
  10. 【专栏精选】实战:动态配置图片
  11. mybatis基础总结01
  12. .NET中的命名规则
  13. Makefile中的@
  14. Zookeeper案例之分布式全局唯一ID生成
  15. 视频消除人声,适用于配音比赛等场合
  16. 综合船桥系统电子海图数据库设计研究
  17. 基于Java的电子会议预约管理系统
  18. android 美妆相机,Android类似美妆相机高级美妆列表
  19. Python爬虫:抓取js生成的数据
  20. Centos7 Failed to start xxx.service: Unit not found

热门文章

  1. 信号归一化功率_选择用于 850 nm 信号功率测量的检测器
  2. 微信小程序开发---应用与页面的生命周期
  3. 【调剂】哈尔滨工程大学 核学院 装置所 收调剂
  4. 错过双11?别慌,会声会影返场大促来了
  5. Communication error with Jack server 1. Try ‘jack-diagnose‘
  6. 前端页面之网站头像处理
  7. window 10 电脑 自动 定时 关机
  8. python 获取昨天、今天、明天的日期
  9. [论文笔记]End-to-end Driving via Conditional Imitation Learning
  10. vue控制钉钉微应用返回,退出钉钉微应用