以下程序是一个信息编码的程序,阅读其encode部分,并补全其decode部分 

最后运行程序,会打印出的一句话。这句话就是我们要求的答案。 
 
注意!这句话是用GBK编码的! 
答案请复制粘贴, 不要手动输入
每次重新登录时请重新答题。
 
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <stdint.h> 
  4. #include <assert.h> 
  5. #include <string.h>  
  6.  
  7.  
  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.     uint32_t  seed  =  password  ^  0x34c1aab9u; 
  13.     for  (size_t  i  =  0  ;  i  <  len;  ++i){ 
  14.         uint8_t  a  =  (  in[i]  ^  seed  )  >>  3; 
  15.         uint8_t  b  =  (  (  ((uint32_t)in[i])  <<  13  )  ^  seed  )  >>  (13-5); 
  16.         a  &=  31; 
  17.         b  &=  224; 
  18.         a  =  31  &  (  a  ^  (b  <<  3)); 
  19.         out[i]  =  a  |  b; 
  20.         seed  =  (((seed  <<  7)  ^  seed  ^  out[i])  +  5393887); 
  21.     } 
  22.  
  23.  
  24. int  
  25. 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.     uint32_t  seed  =  password  ^  0x34c1aab9u; 
  30.     for  (size_t  i  =  0  ;  i  <  len;  ++i){ 
  31.          //请补全这个循环内的代码 
  32.     } 
  33.  
  34. int main(int argc, char* argv[]) 
  35.     const  uint8_t  buf1[]  =  {0x06,  0xc1,  0x79,  0xdb,  0x1b,  0x75,  0x34,  0x0e,  0x26,  0xfe,  0x0d,  0x53,  0xe0,  0xa5,  0x39,  0xdc,  0x82,  0x87,  0xe5,  0x44,  0x79,  0x3a,  0xcd,  0x92,  0x05,  0xc7,  0x25,  0x9e,  0xab,  0xb2,  0xd9,  0x76,  0xec,  0x75,  0x6e,  0x77,  0xfd,  0xc6,  0xf2,  0xd0,  }; 
  36.     uint8_t  buf2[100]  =  {}; 
  37.     const  uint32_t  password  =  0x9f0cc345u; 
  38.     const  size_t  len  =  sizeof(buf1); 
  39.     decode(buf1,  buf2,  password,  len); 
  40.     printf("%s\n",  buf2); 
  41.     return 0; 
  42. }  
 
看来这个题主要考的是逻辑思维,咋一看有点懵了。仔细分析其实只是把encode的部分反过来。a  =  31  &  (  a  ^  (b  <<  3)); 其实是忽悠人的。
答案:
 
  1. uint8_t a = ((in[i] & 31) <<3) ^ seed; 
  2. uint8_t b = ((((uint32_t)in[i] & 224) <<8) ^ seed) >> 13; 
  3. out[i]  =  (a & 248)  |  (b & 7); 
  4. seed  =  (((seed  <<  7)  ^  seed  ^  in[i])  +  5393887);