/*
以下程序是一个信息编码的程序,阅读其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");
}
运行结果:
看视频从搜狗视频搜索开始!!!