现在的位置: 首页 > 综合 > 正文

一道题

2013年10月14日 ⁄ 综合 ⁄ 共 1658字 ⁄ 字号 评论关闭

/*
以下程序是一个信息编码的程序,阅读其encode部分,并补全其decode部分
最后运行程序,会打印出的一句话。这句话就是我们要求的答案。

注意!这句话是用GBK编码的!
答案请复制粘贴, 不要手动输入
每次重新登录时请重新答题
*/
#include "stdafx.h"
#include <iostream>
#include  <stdio.h>
#include  <stdlib.h>
#include  <assert.h>
#include  <string.h>
typedef unsigned int uint32_t;
typedef unsigned char uint8_t;

int  encode(const  void*  raw_in,  void*  raw_out,  uint32_t  password,  size_t  len)
{
    const  uint8_t*  in  =  (const  uint8_t*)raw_in;
    uint8_t*  out  =  (uint8_t*)raw_out;

    uint32_t  seed  =  password  ^  0xe56848bdu;
    for  (size_t  i  =  0  ;  i  <  len;  ++i)  {
        uint8_t  a  =  (  in[i]  ^  seed  )  >>  1;
        uint8_t  b  =  (  (  ((uint32_t)in[i])  <<  14  )  ^  seed  )  >>  (14-7);
        a  &=  127;
        b  &=  128;
        a  =  127  &  (  a  ^  (b  <<  3));
        out[i]  =  a  |  b;
        seed  =  ((seed  ^  in[i])  *  7321  +  in[i]);
    }
    return 1;
}

int  decode(const  void*  raw_in,  void*  raw_out,  uint32_t  password,  size_t  len)
{
    const  uint8_t*  in  =  (const  uint8_t*)raw_in;
    uint8_t*  out  =  (uint8_t*)raw_out;
    uint32_t  seed  =  password  ^  0xe56848bdu;
    for  (size_t  i  =  0  ;  i  <  len;  ++i)  
    {
        //填补代码
        uint8_t a=127&in[i];
        uint8_t b=128&in[i];
        a=127&(a^(b<<3));
        a=254&((a<<1)^seed);
        b=1&(((((uint32_t)b) << 7)^seed)>>14);
        out[i]=a|b;
        seed=((seed^out[i])*7321+out[i]);
    }
    return 1;

}

int  main()
{
    const  uint8_t  buf1[]  =  {0x99,  0x47,  0xac,  0xd8,  0x2d,  0x92,  0xb3,  0xbc,  0x77,  0xb9,  0x9a,  0xe8,  0xb5,  0xfb,  0xda,  0x77,  0x23,  0xf5,  0x47,  0x5a,  0xcd,  0x64,  0x7c,  0x5f,  0x74,  0x22,  0x3e,  0x7c,  0x68,  0x16,  };
    uint8_t  buf2[100]  =  {};
    const  uint32_t  password  =  0xb7197b31u;
    const  size_t  len  =  sizeof(buf1);
    decode(buf1,  buf2,  password,  len);
    printf("%s\n",  buf2);
    system("pause");

}

运行结果:

看视频从搜狗视频搜索开始!!!

抱歉!评论已关闭.