// sad.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "stdint.h"
#include <assert.h>
#include <string.h>
void 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 ^ 0xd65df734u;
for (size_t i = 0 ; i < len; ++i) {
uint8_t a = ( in[i] ^ seed ) >> 1;
uint8_t b = ( ( ((uint32_t)in[i]) << 12 ) ^ seed ) >> (12-7);
a &= 127;
b &= 128;
a = 127 & ( a ^ (b << 3));
out[i] = a | b;
seed = (seed * 144123481 ^ seed ^ out[i]);
}
}
/*
uint8_t c = ((a<<1)^seed)&0xfe;和uint8_t a = ( in[i] ^ seed ) >> 1; 的转化
运用c=a^b;a=c^b;的原理,a = ( in[i] ^ seed ) >> 1可写为a << 1= ( in[i] ^ seed ) ,又可写为
in[i]= ((a << 1) ^ seed) ),反过来时不能直接用in[i],先用c取出来,即为
c= ((a << 1) ^ seed) ),又因为a = ( in[i] ^ seed ) >> 1相当于右移了1位,即这1位(最低的1位被移出)的数据无效了,所以c = ((a<<1)^seed)&0xfe中的0xfe相当于去除无效位(最低一位),b的计算方法和这里相同
*/
void 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 ^ 0xd65df734u;
for (size_t i = 0 ; i < len; ++i) {
// 请在此处补全代码
uint8_t a=in[i]&127; //这部分照着encode里面葫芦画瓢
uint8_t b=in[i]&128; //这部分照着encode里面葫芦画瓢
uint8_t c = ((a<<1)^seed)&0xfe; //运用c=a^b;a=c^b;的原理,将原来的数据还原,并清空无效的数据位
uint8_t d=(((((uint32_t)b)<<5)^seed)>>12)&1; //运用c=a^b;a=c^b;的原理,将原来的数据还原,并清空无效的数据位
out[i]=c|d; //将还原后的高四位和低四位相或
seed = (seed * 144123481 ^ seed ^ in[i]); ; //保证编码和解码用的一个密码;(编码中的out[i]就是解码中的in[i])
}
}
int main()
{
const uint8_t buf1[] = {0x30, 0xa8, 0x88, 0xff, 0x3a, 0x83, 0x9d, 0xff, 0x08, 0x04, 0x5b, 0xf5, 0xfc, 0x6b, 0xc5, 0x2b, 0xf4, 0x80, 0x99, 0xa1, 0xef, 0x8b, 0x6d, 0xcf, 0x3f, 0xee, 0x66, 0x47, 0x72, 0x45, 0x70, 0x36, 0x1c, 0x54, 0xb1, 0x23, 0x0c, 0xa4, 0x26, 0xd6, 0xb9, 0xb6, 0x8b, 0x5a, 0x16, 0x4b, 0xfc, 0x52, 0x48, 0x5c, };
uint8_t buf2[100] = {};
const uint32_t password = 0x2dc8249eu;
const size_t len = sizeof(buf1);
decode(buf1, buf2, password, len);
printf("%s\n", buf2);
}
运行结果是:搜狗输入法承担了数亿中国人所有的文字录入的任务!!
下面是运行效果图: