#include <stdio.h>
#include <stdlib.h>
//#include <stdint.h>
#include <assert.h>
#include <string.h>
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
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 ^ 0xbf9c7264u;
for (size_t i = 0 ; i < len; ++i) {
uint8_t a = ( in[i] ^ seed ) >> 5;
uint8_t b = ( ( ((uint32_t)in[i]) << 15 ) ^ seed ) >> (15-3);
a &= 7;
b &= 248;
a = 7 & ( a ^ (b << 3));
out[i] = a | b;
seed = ((seed ^ out[i]) * 129491 + out[i]);
}
return 0;
}
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 ^ 0xbf9c7264u;
for (size_t i = 0 ; i < len; ++i) {
// 请在此处补全代码
//out[i] = a | b;
uint8_t a = ( in[i] & 7);
uint8_t b = ( in[i] & 248);
//a = 7 & ( a ^ (b << 3));
a = (a ^ (b << 3));
a = (a << 5) ^ seed;
//uint8_t b = ( ( ((uint32_t)in[i]) << 15 ) ^ seed ) >> (15-3);
b = ((((uint32_t)b<<12))^seed )>>15;
//uint8_t a = ( in[i] ^ seed ) >> 1;
a = a & 0xe0;//高3位
b = b & 0x1f;//低5位
out[i] = a | b;
seed = ((seed ^ in[i]) * 129491 + in[i]);
}
return 0;
}
int main()
{
const uint8_t buf1[] = {0x0b, 0xf1, 0x3f, 0x87, 0xd2, 0xa4, 0x08, 0xb9, 0x28, 0x2d, 0x3c, 0xd9, 0x9a, 0xec, 0x3b, 0xe9, 0x42, 0xa5, 0xea, 0x2b, 0xa9, 0x7b, 0xe3, 0x45, 0xd3, 0x45, 0x64, 0x16, 0x66, 0x42, 0xff, 0x5b, 0xb6, 0xe3, 0x7a, 0x6d, 0x7e, 0x6d, 0x5a, 0xf1, 0xa1, 0x5b, 0x5b, 0x71, 0x27, 0x5c, 0xb9, 0x30, 0x55, 0x0b };
uint8_t buf2[100] = {0};
const uint32_t password = 0xc67911cfu;
const size_t len = sizeof(buf1);
decode(buf1, buf2, password, len);
printf("%s\n", buf2);
return 1;
}