以下程式是乙個資訊編碼的程式,閱讀其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都是無符號的整數,我們知道,無符...