#define UART_BASE_ADDR 0x400400
#define THR *((int *)(UART_BASE_ADDR+0))
#define LSR *((int *)(UART_BASE_ADDR+5))
#define IMAGEWIDTH 256L
#define IMAGEHEIGHT 128L
#define DELAYTIME 512
#define quarterOfImage 32
#define halfOfImage 64
#define thirdOfImage 96
extern unsigned char dbImage[IMAGEWIDTH*IMAGEHEIGHT];
extern unsigned int step;
extern unsigned char response[10];
//extern unsigned char dbTargetImage[IMAGEWIDTH*IMAGEHEIGHT];
//extern unsigned char dbDecryptionImage[IMAGEWIDTH*IMAGEHEIGHT];
int mi,mj;
unsigned int m_nWork;
unsigned char * restrict pImg;
unsigned char mark; //用来标记是否是对图片的第一像素进行加密 1是 0否
//unsigned char Coder(unsigned char In, unsigned char clr,unsigned char EnOrDe,unsigned char path);
unsigned char Coder(unsigned char In, unsigned char clr,unsigned char EnOrDe);
unsigned char SendData(unsigned char * restrict pImage,unsigned char mark,unsigned int length);
//加密程序
void Encryption(int nWidth,int nHeight)
{
pImg=dbImage;
//只有是第0块数据时认为是加密的初始状态
if(0==step)
mark = 1;
#pragma MUST_ITERATE(128,128);
for ( mj=0;mj<nHeight;mj++ )
{
//if(40==mj)
//{
// printf("Have encrypted the half of the picture!\n");
//}
#pragma MUST_ITERATE(256,256);
for ( mi=0;mi<nWidth;mi++,pImg++)
{
//(*pImg1)=(~(*pImg))&0x0ff;
//是对图像的第一个像素进行加密
if(1==mark)
{
(*pImg)= Coder((*pImg),1,1);
mark = 0;
}
//不是对图像的第一个像素进行加密
else
(*pImg)= Coder((*pImg),0,1);
}
//图像加密到1/4,2/4,3/4时,向上位机发送图片
if((mj==quarterOfImage)||(mj==halfOfImage)||(mj==thirdOfImage))
{
switch(mj)
{
case quarterOfImage:
SendData(dbImage,0,8192);
break;
case halfOfImage:
SendData(dbImage,1,8192);
break;
case thirdOfImage:
SendData(dbImage,2,8192);
break;
}
//wait(DELAYTIME);
}
}
//图像加密结束时,向上位机发送图片
SendData(dbImage,3,8192);
//wait(DELAYTIME);
}
//解密程序
void Decryption(int nWidth,int nHeight)
{
pImg=dbImage;
//只有是第2块数据时认为是解密的初始状态
if(2==step)
mark=1;
#pragma MUST_ITERATE(128,128);
for ( mj=0;mj<nHeight;mj++ )
{
//if(40==mj)
//{
// printf("Have decrypted the half of the picture!\n");
//}
#pragma MUST_ITERATE(256,256);
for ( mi=0;mi<nWidth;mi++,pImg++ )
{
//(*pImg1)=(~(*pImg))&0x0ff;
//是对图像的第一像素进行解密
if(1==mark)
{
(*pImg) = Coder((*pImg),1,0);
mark = 0;
}
//不是对图像的第一像素进行解密
else
(*pImg) = Coder((*pImg),0,0);
}
//图像解密到1/4,2/4,3/4时,向上位机发送图片
if((mj==quarterOfImage)||(mj==halfOfImage)||(mj==thirdOfImage))
{
switch(mj)
{
case quarterOfImage:
SendData(dbImage,0,8192);
break;
case halfOfImage:
SendData(dbImage,1,8192);
break;
case thirdOfImage:
SendData(dbImage,2,8192);
break;
}
//wait(DELAYTIME);
}
}
//图像解密结束时,向上位机发送图片
SendData(dbImage,3,8192);
//wait(DELAYTIME);
}
//////////////////////////////////////////////////////////////
#define P 2551
#define M 32768
const unsigned int p1=9503, p2=16384,p3=22938; //原本p1=0.29,p2=0.50,p3=0.70,在这里把它们都扩大32168倍
const unsigned int c[5]={15,60,31,29}; //c1,c2,c3,c4
//////////////////////////////////////////////////////////////
//参数注释:In 要处理的像素
// clr 是否要清除原始数据 1清除 非1不清除
// EnOrDe 加密还是解密 1加密 非1解密
// path 选择哪一路进行处理
//unsigned char Coder(unsigned char In, unsigned char clr,unsigned char EnOrDe,unsigned char path)
unsigned char Coder(unsigned char In, unsigned char clr,unsigned char EnOrDe)
{
unsigned char i;
static unsigned char T[4]; // 4 level delay T[0]对应于e(n-1),以此类推
unsigned long Un; //
unsigned char En; //加密后的数据
unsigned char Cn; //没有加密的数据或称原数据
//判断是加密还是解密
if(EnOrDe == 1) //加密
{
Cn = In;
}
else //解密
{
En = In;
}
//只有加密或者解密图片的第一个像素时clr才为1
if(clr == 1)
{
T[1] = T[2] = T[3] =0;
if(EnOrDe == 1) //加密
{
T[0] = En = Cn;
return En;
}
else //解密
{
T[0] = Cn = En;
return Cn;
}
}
//计算Un的值
#pragma MUST_ITERATE(4,4);
for(Un=0,i=0;i<4;i++)
{
Un+=(unsigned long)c[i]*T[i]; //针对DSP结构所作的优化
}
// Un=(unsigned long)c[0]*T[0]+(unsigned long)c[1]*T[1]+(unsigned long)c[2]*T[2]+(unsigned long)c[3]*T[3];
Un = (unsigned long)(Un%P)*13; //针对DSP结构所作的优化
// Un = Un;
//tmp=Un/P; //将取模转换成除、乘、减各一次,但此种改动没有提高效率
//Un-=tmp*P;
//Un = (unsigned long)Un*13;
if(Un<p1)
Un /= 37;
else if(Un <= p2)
Un = (Un - p1)/27;
else if(Un <= p3)
Un = (p3 - Un)/26;
else
Un = (M - Un)/38;
if(EnOrDe == 1)
En =0xff&(Cn + (unsigned char)(0xff&Un));
//En=_sadd(Cn,(unsigned char)(0xff&Un)); //优化:使用内部函数,但此种改动没有提高效率
else
Cn =0xff&(En - (unsigned char)(0xff&Un));
//Cn=_ssub(En,(unsigned char)(0xff&Un)); //优化:使用内部函数,但此种改动没有提高效率
T[3] = T[2];
T[2] = T[1];
T[1] = T[0];
T[0] = En;
if(EnOrDe == 1)
return En;
else
return Cn;
}
//功能:向上位机发送阶段图片数据
//参数:
// pImage 要发送数据的起始地址
// mark 由此标记来决定从数据块的哪个位置输送数据 0~3代表一块数据的第几片数据 4代表响应信息
// length 要传输数据的字节数
unsigned char SendData(unsigned char * restrict pImage,unsigned char mark,unsigned int length)
{
unsigned int index,initOffset;
unsigned int uWork;
//向上位机发送响应信息RIP:*
if(mark==4)
{
#pragma MUST_ITERATE(5,5);
for ( index=0;index<5;index++ )
{
do
{
uWork=LSR;
} while ( uWork&0x040 != 0x040 );
THR=*(pImage+index);
//这个延时对于上位机很重要,太小就会使上位机接收混乱
wait(4);
//wait(128);
}
return 0x01;
}
//向上位机发送图片数据信息
//计算从哪个位置将数据向上位机传输
switch(mark)
{
case 0:
initOffset=0;
break;
case 1:
initOffset=8192;
break;
case 2:
initOffset=16384;
break;
case 3:
initOffset=24576;
break;
}
//先向上位机发送当前发送的是图像数据的第mark片
do
{
uWork=LSR;
} while ( uWork&0x040 != 0x040 );
THR=mark;
//向上位机发送第mark片数据
#pragma MUST_ITERATE(8192,8192);
for ( index=0;index<8192;index++ )
{
do
{
uWork=LSR;
} while ( uWork&0x040 != 0x040 );
THR=*(pImage+initOffset+index);
//这个延时对于上位机很重要,太小就会使上位机接收混乱
wait(4);
//wait(128);
}
return 0x01;
}