免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12941 | 回复: 14
打印 上一主题 下一主题

搜狗在线测评题目(信息编码的程序),高手请进,请指教! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-08 18:49 |只看该作者 |倒序浏览
本帖最后由 snowboy9859 于 2011-09-09 19:03 编辑

以下程序是一个信息编码的程序,阅读其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. }
复制代码
运行结果

论坛徽章:
0
2 [报告]
发表于 2011-09-08 20:27 |只看该作者
传说中的逆向。

论坛徽章:
0
3 [报告]
发表于 2011-09-09 14:23 |只看该作者
回复 2# davelv


    请指教,我贴出了自己的思路,请指点!

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2011-09-09 15:32 |只看该作者
  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.         uint32_t seed = password ^ 0x164ba504u;
  11.         for (size_t i=0; i<len; ++i) {
  12.                 /// 俺不得不说一句,下面这段算法真是太烂了,哪个**公司写的呀
  13.                 uint8_t a = ( in[i] ^ seed ) >> 4;
  14.                 uint8_t b = ( ( ((uint32_t)in[i]) << 12 ) ^ seed ) >> (12-4);
  15.                 a &= 15;
  16.                 b &= 240;
  17.                 a = 15 & ( a ^ (b << 3));
  18.                 out[i] = a | b;
  19.                 seed = ((seed ^ out[i]) * 48475829 + out[i]);
  20.         }

  21.         return 0;
  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.         uint32_t seed = password ^ 0x164ba504u;
  28.         for (size_t i=0; i<len; ++i) {
  29.                 // 随手写就,没仔细验证,错了别怪我
  30.                 out[i] = (((in[i]<<4)^seed)&0xF0) | (((in[i]>>4)^(seed>>12))&0x0F);
  31.                 seed = ((seed ^ in[i]) * 48475829 + in[i]);
  32.         }

  33.         return 0;
  34. }
  35. int main()
  36. {
  37.         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, };
  38.         uint8_t buf2[100] = {};
  39.         const uint32_t password = 0xee90efe9u;
  40.         const size_t len = sizeof(buf1);
  41.         decode(buf1, buf2, password, len);
  42.         printf("%s\n", buf2);

  43.         return 0;
  44. }
复制代码

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2011-09-09 15:34 |只看该作者
/// 俺不得不说一句,下面这段算法真是太烂了,哪个**公司写的呀
------
哈哈,发现一个奥妙,原来这个bbs会自动把一些词汇替换成**,我原文说的是“S13”的中文。

论坛徽章:
0
6 [报告]
发表于 2011-09-09 16:24 |只看该作者
回复 4# bruceteen


    和我贴的代码是一样的结果;不能用啊,能不能再帮我看看,最好能够调试一下,这么修改输出乱码

论坛徽章:
0
7 [报告]
发表于 2011-09-09 16:26 |只看该作者
回复 5# bruceteen


    搜狐公司写的,哈哈

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
8 [报告]
发表于 2011-09-09 16:51 |只看该作者
回复  bruceteen


    和我贴的代码是一样的结果;不能用啊,能不能再帮我看看,最好能够调试一下,这么修改输出乱码
snowboy9859 发表于 2011-09-09 16:24


哦,我测试了一下代码,你的代码和我的代码都输出是“搜狗搜索是全球首个中文网页收录量达到100亿的搜索引擎!!!”

论坛徽章:
0
9 [报告]
发表于 2011-09-09 17:00 |只看该作者
回复 8# bruceteen


    你在哪个环境下编译运行的?我在gcc上没结果,乱码,难道不能显示中文?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2011-09-09 17:03 |只看该作者
这个除了考察人的眼力外, 真不知道比简单的位运算题目好到哪里去
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP