实用 | C代码实现数据通信中的转义与解析(一)转义

共 8476字,需浏览 17分钟

 ·

2021-04-01 11:51

扫描二维码

获取更多精彩

嵌入式杂牌军

                                                     

                                                  编辑|追梦星空

                                            公众号|嵌入式杂牌军


✎ 编 者 悟 语

    

      按部就班是加法的思维,阶段性的转变(克服惰性的优化调整)才是倍增的思维。



文 章 导 读


    今天与小伙伴们分享一下数据通信过程中数据的转义与解析的一种实现方式,今天先进行转义部分的代码实现,后面再写一篇数据的解析文章。

    阅读过程中有什么问题可以后台交流哈,


1 关于转义与解析的说明



    0)为什么要进行转义与解析


    数据通信中需要对有特定功能的数据在发送时进行转义,在接收时进行解析


    比如通信协议中将0x8a作为帧起始符号,将0x8c作为帧结束符号,为了避免混淆,当数据中也出现0x8a或0x8c时就要对这些字符进行转义,这样可以避免将数据误作为起始或结束帧


    转义可以类比C代码的转义字符


    1)什么是数据的转义


    在数据发送时,将敏感功能编码相同的数据转换为协议可识别的数据的过程。

 

    2)什么是数据的解析


    在数据接收时,将转义数据恢复成原发送数据的过程。


2 实例代码



    1)实例代码


    下面代码的转义规则如下


    0x8a -> 0x8c0    
    0x8b -> 0x8c0b      
    0x8c -> 0x8c0c  


    数据中碰到十六进制的8a就将8a替换为8c0a,其他两个类似,不满足转义条件的数据保持不变。


    说明都在代码注释中了,


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

/* 转义函数声明 */ 
char *EscapeData(uint32_t dat);                   


int main(int argc, char *argv[]) 
{
     uint32_t inputdata = 0x128a8b8c;        // 要转义的数据     
 
     char *p = malloc(100);          
    
     printf("\n转义规则:\n                       \
                        \n   0x8a -> 0x8c0a      \
                        \n   0x8b -> 0x8c0b      \
                        \n   0x8c -> 0x8c0c      \
                        \n   数据不满足条件不变    \ 
                        \n"
);
 
     printf("\n转义前的数据:0x%x\n",inputdata);  // 打印转义前的数据 
 
     strcpy(p,EscapeData(inputdata));           // int转字符串后进行数据转义 
    
     printf("转义后的数据:0x%s\n",p);            // 打印转义后的数据 
    
     free(p);
 
     return 0;
}

/* 转义函数 */ 
char *EscapeData(uint32_t dat)
{
     int i;
 
     uint32_t tmp[4] = {0,0,0,0},array[10] = {0,0,0,0,0,0,0,0,0,0};
 
     char s0[10],s1[10],s2[10],s3[10];

     char *ret = malloc(100);
    
     /* 按字节分割32位数据 */
     tmp[0] =  dat & 0xFF;         // 最低位
     tmp[1] =  (dat >> 8) & 0xFF;  // 次低位
     tmp[2] =  (dat >> 16) & 0xFF; // 次高位
     tmp[3] =  (dat >> 24) & 0xFF; // 最高位 
    
     /* 按条件进行数据字节转义 */
     for(i = 0; i < 4; i++)                 
     {
          if((tmp[i] == 0x8a) && (tmp[i] != 0x8b) && (tmp[i] != 0x8c))
          {
               array[i] = (0x8c << 8) | (0x8a^0x80); // 按转义条件进行转义 0x8a -> 0x8c 0x0a -> 0x8c0a
          }
          else if((tmp[i] == 0x8b) && (tmp[i] != 0x8a) && (tmp[i] != 0x8c))
          {
               array[i] = (0x8c << 8) | (0x8b^0x80); // 按转义条件进行转义 0x8b -> 0x8c 0x0b -> 0x8c0b
          }
          else if((tmp[i] == 0x8c) && (tmp[i] != 0x8a) && (tmp[i] != 0x8b))
          {
               array[i] = (0x8c << 8) | (0x8c^0x80); // 按转义条件进行转义 0x8c -> 0x8c 0x0c -> 0x8c0c
          }
          else
          {
              array[i] = tmp[i];                     // 不满足转义条件的数据不变 
          } 
     }
 
     /* 按字节进行整数转字符串 */ 
     sprintf(s0,"%02x",array[0]);                   
     sprintf(s1,"%02x",array[1]);
     sprintf(s2,"%02x",array[2]);
     sprintf(s3,"%02x",array[3]);

     /* 字符串拼接 */ 
     ret = strcat(s3,strcat(s2,strcat(s1,s0)));      

     free(ret); 
 
     return ret;
}



    2)运行结




    今天就到这吧,希望对小伙伴有所帮助哈,喜欢的话欢迎转发、点赞、分享、在看哈,


相关推荐


函数被调用时发生了什么——过程活动记录


指针数组为什么不能这样初始化


数组与指针不能混用的情况


总线错误与段错误


专辑分享


Linux专辑


C语言专辑


软实力专辑


软件推荐专辑



欢迎关注我的公众号,一起撸代码玩技
浏览 65
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐