搜狗 2012 校園招聘 網測題

2021-05-28 05:21:58 字數 2430 閱讀 8070

以下程式是乙個資訊編碼的程式,閱讀其encode部分,並補全其decode部分

最後執行程式,會列印出的一句話。這句話就是我們要求的答案。 (本段**遵循c99標準,gcc編譯**-std=c99)

注意!這句話是用gbk編碼的!

題目:#include 

#include 

//#include 

#include 

#include 

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)

return 0;

} int  decode(const  void*  raw_in,  void*  raw_out,  uint32_t  password,  size_t  len)

return 0;

} int  main()

;uint8_t  buf2[100]  =  {};

const  uint32_t  password  =  0xa97e3826u;

const  size_t  len  =  sizeof(buf1);

decode(buf1,  buf2,  password,  len);

printf("%s\n",  buf2);

system("pause");

return 0;

} 輸出結果為:

搜狗拼音輸入法開創了基於搜尋引擎全新的輸入模式!!!

解題思路:

推反的過程。

uint8_t  a  =  (  in[i]  ^  seed  )  >>  2; 

//in[i]為uint_t型別的元素,有8個bit位,與32位種子做異或操作,之後向右移兩位(未知)得到的結果為??******,儲存在a中,原來in[i]與seed做異或操作後的低6位結果儲存在a中

uint8_t  b  =  (  (  ((uint32_t)in[i])  <<  12  )  ^  seed  )  >>  (12-6);

//同理先將in[i]轉化為32位數,向左移動12位,與種子做異或操作,再將其右移6位後(未知),將其賦值給uint8_t變數b中得到xx??????。原來in[i]與seed做異或操作後的高2位結果儲存在b中

a  &=  63;

//做與操作,63的二進位制形式為00111111;a & 63將a的高兩位置零,a變為:00******

b  &=  192;

//與操作,192的二進位制形式為11000000;b & 192 將b的低6位置零,b變為:xx000000

a  =  63  &  (  a  ^  (b  <<  3));

//仔細算來,該操作並未改變a的值,屬於誤導的操作,分析如下,b<<3得到0000000 a為00****** a^(b<<3)結果為 00****** & 00111111= 00******;

out[i]  =  a  |  b;

//00****** | xx000000,將加密後的前2位和後兩位組合起來

seed  =  (seed  *  3687989  ^  seed  ^  out[i]);

//每次依據加密後的值改變種子的行為

解碼部分:

uint8_t a = in[i] & 63;

//得到加密資料的後6位 儲存為a

uint8_t b = in[i] & 192;

//得到加密資料的前2位 儲存為b

uint8_t c = ((a<<2) ^ seed ) &252;

//做逆操作根據a=b ^ c,得 b=a ^ c,對加密部分uint8_t  a  =  (  in[i]  ^  seed  )  >>  2; 的逆轉,由於》2導致該部分資料形式為******??將其未置部分資料清零即 &252 (11111100)

uint8_t d = (((((uint32_t) b) << 6) ^ seed) >> 12) & 3;

//做逆操作根據a=b ^ c,得 b=a ^ c,對加密部分  uint8_t  b  =  (  (  ((uint32_t)in[i])  <<  12  )  ^  seed  )  >>  (12-6); ,由於<<12 並且 >>6得到??????xx將其未置部分資料清零

&3(00000011)

out[i] = c | d;

//將兩部分資料組合在一起

seed = ( seed * 3687989 ^ seed ^ in[i]);

//種子部分的雙方保持一致,原來的out[i]儲存的是加密的資料,現在in[i]儲存的是加密的資料,因此應該置為上述表達

(encode decode sougou)

2012搜狗校園招聘筆試題

include using namespace std int main unsigned char p unsigned char input int s 0 int temp sizeof input for int i 0 ichar v p i if v 0 s v a i printf d...

2012搜狗校園招聘筆試題

1 下面 中for迴圈共執行了多少次?unsigned short i,j for i 0,j 2 i j i 5,j 7 unsigned short占用2個位元組,當資料範圍到頭了 2 16 1 就又從0開始計數了,這個其實就是兩輛汽車行駛在乙個圓圈裡的汽車追及問題。乙個速度為5,乙個速度為7,...

2012搜狗校園招聘筆試題 1

最近發現了幾個公司招聘的筆試機試題,雖然是兩年前的,但是題目還不錯,所以做了做,下面給出自己對一些題的理解。問題描述 下面 中for迴圈共執行了多少次?unsigned short i,j for i 0,j 2 i j i 5,j 7 問題分析 首先,看到變數i和j都是無符號的整數,我們知道,無符...