关于搜狗网上测评试题的解法(GBK的)。

// 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); 
}


 

 

运行结果是:搜狗输入法承担了数亿中国人所有的文字录入的任务!!

下面是运行效果图:

 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aklixiaoyao123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值