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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

下面是一个简单的HDLC协议代码示例,使用C语言编写: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define FLAG 0x7e #define ESCAPE 0x7d #define XOR_BYTE 0x20 unsigned char buffer[1024]; // 接收缓冲区 int buffer_pos = 0; void send_frame(unsigned char* data, int len) { unsigned char frame[1024]; int frame_pos = 0; int i; // 添加起始标志 frame[frame_pos++] = FLAG; // 转义并添加数据 for (i = 0; i < len; i++) { if (data[i] == FLAG || data[i] == ESCAPE) { frame[frame_pos++] = ESCAPE; frame[frame_pos++] = data[i] ^ XOR_BYTE; } else { frame[frame_pos++] = data[i]; } } // 添加结束标志 frame[frame_pos++] = FLAG; // 发送帧 // ... } void receive_byte(unsigned char byte) { if (byte == FLAG) { // 帧开始 buffer_pos = 0; } else if (byte == ESCAPE) { // 转义字符 // 等待下一个字节 } else { // 普通字节 buffer[buffer_pos++] = byte; if (buffer_pos >= sizeof(buffer)) { // 缓冲区溢出 // ... } if (byte == FLAG) { // 帧结束 unsigned char data[1024]; int data_pos = 0; int i; // 反转义并提取数据 for (i = 0; i < buffer_pos; i++) { if (buffer[i] == ESCAPE) { i++; data[data_pos++] = buffer[i] ^ XOR_BYTE; } else { data[data_pos++] = buffer[i]; } } // 处理数据 // ... } } } int main() { // 测试发送 unsigned char data[] = {0x01, 0x02, 0x03}; send_frame(data, sizeof(data)); // 测试接收 unsigned char frame[] = {0x7e, 0x01, 0x7d, 0x5e, 0x02, 0x7d, 0x5d, 0x03, 0x7e}; int i; for (i = 0; i < sizeof(frame); i++) { receive_byte(frame[i]); } return 0; } ``` 这个代码示例演示了如何使用C语言实现HDLC协议的基本功能,包括帧的发送和接收,以及字节的转义和反转义。请注意,这只是一个简单的示例,实际应用中可能需要根据具体的需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值