int file_block_globe_encode(unsigned char *fd,unsigned int len,unsigned int file_offset)
{
unsigned int index;
unsigned char * base=fd;
unsigned char *pdata,data;
unsigned char *d_end=fd+len-1; if(file_offset&0xf) //not 16 bytes,aligned
{
base=fd-(file_offset&0xf);
index=_I(file_offset);
pdata=base+(unsigned int)(_O(index));
if(pdata>=fd && pdata<=d_end)
{
data=*pdata;
data=data^_K(index);
data=data<<_S(index) | data>>(8-_S(index));
*pdata=data;
}
base=base+16;
file_offset=(file_offset& ~0xf)+16;
}
for(;base<d_end;base=base+16 ) //16 bytes aligned
{
index=_I(file_offset);
pdata=base+(unsigned int)(_O(index));
if(pdata<=d_end)
{
data=*pdata;
data=data^_K(index);
data=data<<_S(index) | data>>(8-_S(index));
*pdata=data;
}
file_offset=file_offset+16;
}
return 0;
}