Chinaunix首页 | 论坛 | 博客
  • 博客访问: 464034
  • 博文数量: 68
  • 博客积分: 2606
  • 博客等级: 上尉
  • 技术积分: 1308
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-13 23:01
文章分类
文章存档

2012年(6)

2011年(62)

分类: C/C++

2011-09-09 19:06:11

------------------------------------------
本文为本人原创,欢迎转载!
转载请注明出处:snowboy.blog.chinaunix.net
雪夜流星
------------------------------------------
以下程序是一个信息编码的程序,阅读其encode部分,并补全其decode部分 
最后运行程序,会打印出的一句话。这句话就是我们要求的答案。 (本段代码遵循c99标准,gcc编译请加-std=c99,由于linux下不能输出中文(经过验证),请在vc下用.cpp文件的形式编译)
注意!这句话是用GBK编码的!

#include   
#include   
#include   
#include   
#include   


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 ^ 0x164ba504u; 
        for (size_t i = 0; i < len; ++i) 
        { 
                uint8_t  a = (in[i] ^ seed) >> 4; //将in[i]的高四位异或后的结果存放在a的低四位中
                uint8_t  b  = ((((uint32_t)in[i]) << 12)^seed)>>(12-4); //将in[i]的低四位异或后放
                                                                                                   在b的高四位中
                a &= 15; //将未存储有效数据位清零
                b &= 240; //将未存储有效数据位清零
                a = 15 & (a ^(b <<3)); //这句约等于没有,不起任何作用起误导作用
                out[i] = a | b; //把经过转换的数据相或组成新的数据
                seed = ((seed ^ out[i]) * 48475829 + out[i]); //通过通式更新seed
        } 


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 ^ 0x164ba504u; 
        for(size_t  i = 0  ;  i < len; ++i)
        {         
                 //  请在此处补全代码 
         uint8_t  a = in[i] & 15;//取出in[i]的低四位放入a中
         uint8_t  b = in[i] & 240;//取出in[i]的高四位放入b中
         uint8_t  c = ((a<<4)^seed)&240;//运用c=a^b;a=c^b;的原理,将原来的数据还原,并
                                                                  清空无效的数据位
         unit8_t  d = (((((uint32_t)b)<<8)^seed)>>12)&15;//运用c=a^b;a=c^b;的原理,
将原来的数据还原,并清空无效的 数据位
         out[i] = c | d;//将还原后的高四位和低四位相或
         seed  =  ((seed  ^  in[i])  *  48475829  +  in[i]);//保证编码和解码用的一个密码;(编码 中的out[i]就是解码中的in[i])
        } 
int  main() 
        const uint8_t buf1[] = {0xf2,  0x60,  0xab,  0xa6,  0xa5,  0xbe,  0xc9,  0x39,  0x15,      0xdf,  0xe6,  0x06,  0x47,  0x02,  0xa6,  0xfb,  0xcb,  0x60,      0x76,  0xf0,  0x08,  0xfb,  0x92,  0xe4,  0xaf,  0x4d,  0x22,      0x7a,  0x6a,  0xfe,  0xcf,  0x85,  0x25,  0x25,  0xfc,  0x31,      0xe4,  0xa2,  0x10,  0x2b,  0xd8,  0x50,  0x8f,  0x7f,  0x3f,      0xf0,  0xde,  0xee,  0x30,  0x96,  0x24,  0x7f,  0x9f,  0x56,      0x06,  0x21,  0xd3,  }; 
        uint8_t buf2[100] = {}; 
        const uint32_t password = 0xee90efe9u; 
        const size_t len  = sizeof(buf1); 
        decode(buf1, buf2, password,  len); 
        printf("%s\n", buf2); 

由于本人装的vc不支持c99,将程序改编如下:
在此将测试程序贴出:(此程序可以在vc下直接编译运行)
#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) 
        const  uint8_t*  in  =  (const  uint8_t*)raw_in; 
        uint8_t*  out  =  (uint8_t*)raw_out; 
        
        uint32_t  seed  =  password  ^  0x164ba504u; 
        for  (size_t  i  =  0  ;  i  <  len;  ++i) 
       { 
                uint8_t  a  =  (  in[i]  ^  seed  )  >>  4; 
                uint8_t  b  =  (  (  ((uint32_t)in[i])  <<  12  )  ^  seed  )  >>  (12-4); 
                a  &=  15; 
                b  &=  240; 
                a  =  15  &  (  a  ^  (b  <<  3)); 
                out[i]  =  a  |  b; 
                seed  =  ((seed  ^  out[i])  *  48475829  +  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  ^  0x164ba504u; 
        for  (size_t  i  =  0  ;  i  <  len;  ++i)  
 //  请在此处补全代码
         out[i] = (((in[i]<<4)^seed)&0xF0) | (((in[i]>>4)^(seed>>12))&0x0F);
     seed = ((seed ^ in[i]) * 48475829 + in[i]);                                    
        } 
        return 0;
int  main(void) 
        const  uint8_t  buf1[]  =  {0xf2,  0x60,  0xab,  0xa6,  0xa5,  0xbe,  0xc9,  0x39,   0x15,  0xdf,  0xe6,  0x06,  0x47,  0x02,  0xa6,  0xfb,   0xcb,  0x60,  0x76,  0xf0,  0x08,  0xfb,  0x92,  0xe4,   0xaf,  0x4d,  0x22,  0x7a,  0x6a,  0xfe,  0xcf,  0x85, 0x25,  0x25,  0xfc,  0x31,  0xe4,  0xa2,  0x10,  0x2b,   0xd8,  0x50,  0x8f,  0x7f,  0x3f,  0xf0,  0xde,  0xee, 0x30,  0x96,  0x24,  0x7f,  0x9f,  0x56,  0x06,  0x21,   0xd3,  }; 
        uint8_t  buf2[100]  =  {0}; 
        const  uint32_t  password  =  0xee90efe9u; 
        const  size_t  len  =  sizeof(buf1); 
        decode(buf1,  buf2,  password,  len); 
        printf("%s\n",  buf2); 

        return 0;
运行结果如下:
阅读(2394) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~