打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
搜狗在线测评题目(信息编码的程序),高手请进,请指教!
以下程序是一个信息编码的程序,阅读其encode部分,并补全其decode部分
最后运行程序,会打印出的一句话。这句话就是我们要求的答案。 (本段代码遵循c99标准,gcc编译请加-std=c99)

注意!这句话是用GBK编码的!
  1. #include  <stdio.h>
  2. #include  <stdlib.h>
  3. #include  <stdint.h>
  4. #include  <assert.h>
  5. #include  <string.h>


  6. int  encode(const  void*  raw_in,  void*  raw_out,  uint32_t  password,  size_t  len)
  7. {
  8.         const uint8_t* in=(const  uint8_t*)raw_in;
  9.         uint8_t* out=(uint8_t*)raw_out;
  10.        
  11.         uint32_t seed = password ^ 0x164ba504u;
  12.         for (size_t i = 0; i < len; ++i)
  13.         {
  14.                 uint8_t  a = (in[i] ^ seed) >> 4; //将in[i]的高四位异或后的结果存放在a的低四位中
  15.                 uint8_t  b  = ((((uint32_t)in[i]) << 12)^seed)>>(12-4); //将in[i]的低四位异或后放在b的高四位中
  16.                 a &= 15; //将未存储有效数据位清零
  17.                 b &= 240; //将未存储有效数据位清零
  18.                 a = 15 & (a ^(b <<3)); //这句约等于没有,不起任何作用起误导作用
  19.                 out[i] = a | b; //把经过转换的数据相或组成新的数据
  20.                 seed = ((seed ^ out[i]) * 48475829 + out[i]); //通过通式更新seed
  21.         }
  22. }


  23. int  decode(const void* raw_in, void* raw_out, uint32_t password, size_t  len)
  24. {
  25.         const  uint8_t* in = (const  uint8_t*)raw_in;
  26.         uint8_t* out = (uint8_t*)raw_out;
  27.        
  28.         uint32_t seed = password ^ 0x164ba504u;
  29.         for(size_t  i = 0  ;  i < len; ++i)
  30.         {        
  31.                  //  请在此处补全代码 (本人不才,下面代码为自己给出尚且通过调试未得到预期的答案,请高手指教)
  32.         uint8_t  a = in[i] & 15;//取出in[i]的低四位放入a中
  33.         uint8_t  b = in[i] & 240;//取出in[i]的高四位放入b中
  34.         uint8_t  c = ((a<<4)^seed)&240;//运用c=a^b;a=c^b;的原理,将原来的数据还原,并清空无效的数据位
  35.         unit8_t  d = (((((uint32_t)b)<<8)^seed)>>12)&15;//运用c=a^b;a=c^b;的原理,将原来的数据还原,并清空无效的数据位
  36.         out[i] = c | d;//将还原后的高四位和低四位相或
  37.         seed  =  ((seed  ^  in[i])  *  48475829  +  in[i]);//保证编码和解码用的一个密码;(编码中的out[i]就是解码中的in[i])
  38.         }
  39. }
  40. int  main()
  41. {
  42.         const uint8_t buf1[] = {0xf2,  0x60,  0xab,  0xa6,  0xa5,  0xbe,  0xc9,  0x39,  0x15,  0xdf,  0xe6,  0x06,  0x47,  0x02,  0xa6,  0xfb,  0xcb,  0x60,  0x76,  0xf0,  0x08,  0xfb,  0x92,  0xe4,  0xaf,  0x4d,  0x22,  0x7a,  0x6a,  0xfe,  0xcf,  0x85,  0x25,  0x25,  0xfc,  0x31,  0xe4,  0xa2,  0x10,  0x2b,  0xd8,  0x50,  0x8f,  0x7f,  0x3f,  0xf0,  0xde,  0xee,  0x30,  0x96,  0x24,  0x7f,  0x9f,  0x56,  0x06,  0x21,  0xd3,  };
  43.         uint8_t buf2[100] = {};
  44.         const uint32_t password = 0xee90efe9u;
  45.         const size_t len  = sizeof(buf1);
  46.         decode(buf1, buf2, password,  len);
  47.         printf("%s\n", buf2);
  48. }
复制代码
要补全之后求答案

在此将测试程序贴出:(此程序可以在vc下直接编译运行)
  1. #include  <stdio.h>
  2. #include  <stdlib.h>
  3. //#include  <stdint.h>
  4. #include  <assert.h>
  5. #include  <string.h>

  6. typedef unsigned int uint32_t;
  7. typedef unsigned char uint8_t;

  8. int  encode(const  void*  raw_in,  void*  raw_out,  uint32_t  password,  size_t  len)
  9. {
  10.         const  uint8_t*  in  =  (const  uint8_t*)raw_in;
  11.         uint8_t*  out  =  (uint8_t*)raw_out;
  12.        
  13.         uint32_t  seed  =  password  ^  0x164ba504u;
  14.         for  (size_t  i  =  0  ;  i  <  len;  ++i)  {
  15.                 uint8_t  a  =  (  in[i]  ^  seed  )  >>  4;
  16.                 uint8_t  b  =  (  (  ((uint32_t)in[i])  <<  12  )  ^  seed  )  >>  (12-4);
  17.                 a  &=  15;
  18.                 b  &=  240;
  19.                 a  =  15  &  (  a  ^  (b  <<  3));
  20.                 out[i]  =  a  |  b;
  21.                 seed  =  ((seed  ^  out[i])  *  48475829  +  out[i]);
  22.         }

  23.         return 0;
  24. }


  25. int  decode(const  void*  raw_in,  void*  raw_out,  uint32_t  password,  size_t  len)
  26. {
  27.         const  uint8_t*  in  =  (const  uint8_t*)raw_in;
  28.         uint8_t*  out  =  (uint8_t*)raw_out;
  29.        
  30.         uint32_t  seed  =  password  ^  0x164ba504u;
  31.         for  (size_t  i  =  0  ;  i  <  len;  ++i)  {
  32.         out[i] = (((in[i]<<4)^seed)&0xF0) | (((in[i]>>4)^(seed>>12))&0x0F);

  33.     seed = ((seed ^ in[i]) * 48475829 + in[i]);
  34.                                
  35.                                 //  请在此处补全代码
  36.         }
  37.         return 0;
  38. }
  39. int  main(void)
  40. {
  41.         const  uint8_t  buf1[]  =  {0xf2,  0x60,  0xab,  0xa6,  0xa5,  0xbe,  0xc9,  0x39,  0x15,  0xdf,  0xe6,  0x06,  0x47,  0x02,  0xa6,  0xfb,  0xcb,  0x60,  0x76,  0xf0,  0x08,  0xfb,  0x92,  0xe4,  0xaf,  0x4d,  0x22,  0x7a,  0x6a,  0xfe,  0xcf,  0x85,  0x25,  0x25,  0xfc,  0x31,  0xe4,  0xa2,  0x10,  0x2b,  0xd8,  0x50,  0x8f,  0x7f,  0x3f,  0xf0,  0xde,  0xee,  0x30,  0x96,  0x24,  0x7f,  0x9f,  0x56,  0x06,  0x21,  0xd3,  };
  42.         uint8_t  buf2[100]  =  {0};
  43.         const  uint32_t  password  =  0xee90efe9u;
  44.         const  size_t  len  =  sizeof(buf1);
  45.         decode(buf1,  buf2,  password,  len);
  46.         printf("%s\n",  buf2);

  47.         return 0;
  48. }
复制代码
运行结果
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
CRC校验代码与使用技巧
数据包协议设计(通讯协议的设计)
转载:测试了一下hash函数的性 — Windows Live
关于CRC8/CRC16/CRC32,你要找的全部在这
C字符串 与 uint32类型互相转换
嵌入式大杂烩周记 | 第 14 期
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服