以下程序是一个信息编码的程序,阅读其encode部分,并补全其decode部分
最后运行程序,会打印出的一句话。这句话就是我们要求的答案。
注意!这句话是用GBK编码的!
答案请复制粘贴, 不要手动输入
每次重新登录时请重新答题。
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <assert.h>
- #include <string.h>
- 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 ^ 0x34c1aab9u;
- for (size_t i = 0 ; i < len; ++i){
- uint8_t a = ( in[i] ^ seed ) >> 3;
- uint8_t b = ( ( ((uint32_t)in[i]) << 13 ) ^ seed ) >> (13-5);
- a &= 31;
- b &= 224;
- a = 31 & ( a ^ (b << 3));
- out[i] = a | b;
- seed = (((seed << 7) ^ seed ^ out[i]) + 5393887);
- }
- }
- 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 ^ 0x34c1aab9u;
- for (size_t i = 0 ; i < len; ++i){
- //请补全这个循环内的代码
- }
- }
- int main(int argc, char* argv[])
- {
- const uint8_t buf1[] = {0x06, 0xc1, 0x79, 0xdb, 0x1b, 0x75, 0x34, 0x0e, 0x26, 0xfe, 0x0d, 0x53, 0xe0, 0xa5, 0x39, 0xdc, 0x82, 0x87, 0xe5, 0x44, 0x79, 0x3a, 0xcd, 0x92, 0x05, 0xc7, 0x25, 0x9e, 0xab, 0xb2, 0xd9, 0x76, 0xec, 0x75, 0x6e, 0x77, 0xfd, 0xc6, 0xf2, 0xd0, };
- uint8_t buf2[100] = {};
- const uint32_t password = 0x9f0cc345u;
- const size_t len = sizeof(buf1);
- decode(buf1, buf2, password, len);
- printf("%s\n", buf2);
- return 0;
- }
看来这个题主要考的是逻辑思维,咋一看有点懵了。仔细分析其实只是把encode的部分反过来。a = 31 & ( a ^ (b << 3)); 其实是忽悠人的。
答案:
- uint8_t a = ((in[i] & 31) <<3) ^ seed;
- uint8_t b = ((((uint32_t)in[i] & 224) <<8) ^ seed) >> 13;
- out[i] = (a & 248) | (b & 7);
- seed = (((seed << 7) ^ seed ^ in[i]) + 5393887);
转载于:https://blog.51cto.com/aboocool/664583