Chinaunix首页 | 论坛 | 博客
  • 博客访问: 515405
  • 博文数量: 77
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 689
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-12 08:40
文章分类

全部博文(77)

文章存档

2018年(1)

2016年(3)

2015年(24)

2014年(49)

我的朋友

分类: C/C++

2015-04-22 20:40:57


点击(此处)折叠或打开

  1. /*
  2. * 功能:提取带有指定桢头(fc 00 2b 20)的一段十六进制字符串,替换桢头并存入文件
  3. *
  4. * 例:
  5. * 41 fc 00 2b 20 2e 99 11 0c 09 41 0e 59 a5 41 b1 9f 92 19 83 b5 b6 e9 9e 01 cc a3 1f c0 79 7a 8c 54 15 7e f0 d3 6f c2 ce aa 26 49 3b f6 1d 6e 00
  6. * fc 00 2b 20 2b 95 9e 41 89 88 b7 13 5b 2c 07 18 79 c2 33 ab 3c da f0 f1 cc 2d 8e b6 db 5c a3 90 b9 c6 6e de f4 bf 2c 07 65 f9 3b f5 29 c9 00
  7. * fc 00 2b 20 2e 93 10 46 e9 ef 7f 3e 51 0e 34 2e a0 08 e9 96 bf f4 fb e6 0a 50 9d dd 34 1c 84 24 d7 1a ee e6 47 10 b8 39 f3 29 3b f3 a9 08 00 fc 00 2b
  8. *
  9. * 要求:
  10. * 2a 00 00 00 2e 99 11 0c 09 41 0e 59 a5 41 b1 9f 92 19 83 b5 b6 e9 9e 01 cc a3 1f c0 79 7a 8c 54 15 7e f0 d3 6f c2 ce aa 26 49 3b f6 1d 6e
  11. * 2a 00 00 00 2b 95 9e 41 89 88 b7 13 5b 2c 07 18 79 c2 33 ab 3c da f0 f1 cc 2d 8e b6 db 5c a3 90 b9 c6 6e de f4 bf 2c 07 65 f9 3b f5 29 c9
  12. * 2a 00 00 00 2e 93 10 46 e9 ef 7f 3e 51 0e 34 2e a0 08 e9 96 bf f4 fb e6 0a 50 9d dd 34 1c 84 24 d7 1a ee e6 47 10 b8 39 f3 29 3b f3 a9 08
  13. */

  14. long long j = 0;
  15. unsigned char Tempbuf[4096*3];

  16. void main()
  17. {
  18.     //....获取str

  19.     memset(Tempbuf, 0, sizeof(Tempbuf));

  20.     ProcessData(str,len);
  21.     
  22.     return;
  23. }

  24. void ProcessData(unsigned char *str,int len)
  25. {
  26.     int i = 0;
  27.     unsigned int msg_length,length;
  28.     unsigned char *buf = str;
  29.     
  30.     if(j > 0) //若有存入过剩余数据至Tempbuf
  31.     {
  32.         memcpy(&Tempbuf[j],str,len); //则,将本次传入的数据追加到上一次未读取完的数据,长度也变化
  33.         len += j;
  34.         memcpy(buf,Tempbuf,len);
  35.         //buf = Tempbufnot use like this , the same address,clear one,both clear.
  36.     }

  37.     for(i = 0;i < len;i++)
  38.     {
  39.         if((buf[i] == 0xFC) && (buf[i+1] == 0x00) && (buf[i+2] == 0x2B) && (buf[i+3] == 0x20)) //找到桢头开始的地方<i>
  40.         {
  41.             
  42.             msg_length = buf[i+2]; //43 内容长度
  43.             length = msg_length + 4; //一桢数据长度 含0x00

  44.             if(len - i >= length && buf[i + length - 1] == 0x00) //剩余数据长度大于一桢数据长度,则一桢数据完整
  45.             {
  46.                 buf[i] = 0x2A;
  47.                 buf[i+1] = 0x00;
  48.                 buf[i+2] = 0x00;
  49.                 buf[i+3] = 0x00;
  50.                 file.Write(&buf[i],length-1); //-0x00    MFC文件操作
  51.             }else{                             //否则记录剩余数据长度<j>,并将剩余数据存入Tempbuf(此情况指:搜索到str尾部时,剩余数据有完整桢头)
  52.                 j = len - i;
  53.                 memset(Tempbuf, 0, sizeof(Tempbuf));
  54.                 memcpy(Tempbuf,&buf[i],j);
  55.                 return;
  56.             }
  57.         }else{
  58.             if(len - i < length)    //若找不到完整的桢头,且剩余数据长度小于一桢数据长度(此情况指:搜索到str尾部时,剩余数据桢头不完整)                    
  59.             {
  60.                 j = len - i;        //记录剩余数据长度<j>,并将剩余数据存入Tempbuf
  61.                 memset(Tempbuf, 0, sizeof(Tempbuf));
  62.                 memcpy(Tempbuf,&buf[i],j);
  63.                 return;
  64.             }
  65.         }
  66.     }
  67.     
  68.     return;
  69. }


阅读(1664) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~