|
#include <stdlib.h> #include <stdio.h> #include <strings.h> #include <unistd.h> #include <math.h>
#define maxLen 3600 void main(int argc,char **argv[]) { FILE *fd, *fd0,*fd1, *fd2; int i, j, iOut, jOut; unsigned vInt[maxLen], vFloat[maxLen]; unsigned vOutInt[maxLen], vOutFloat[maxLen]; unsigned vTmpInt[maxLen]; int vPrintInt[maxLen]; unsigned flag, flag2; fd = fopen("test", "r"); fd0 = fopen("test1", "r"); fd1 = fopen("test2", "w"); fd2 = fopen("test3", "w"); for(i=0;i<maxLen;i++){ fread(&vFloat[i], sizeof(float), 1, fd); fread(&vInt[i], sizeof(unsigned), 1, fd0); vOutInt[i]=vOutFloat[i]=vTmpInt[i]=0; vPrintInt[i]=0; }
//对float部分数据进行shuffle算法
flag = 1; for(i=0,iOut=0,jOut=0;i<sizeof(int)*8;i++) { for(j=0;j<maxLen;j++){ if(vFloat[j]&flag) vOutFloat[jOut]+=1;
iOut++; if(iOut==sizeof(int)*8) { iOut =0; jOut++; }else vOutFloat[jOut]=vOutFloat[jOut]<<1; } flag = flag<<1; }
//对int部分数据进行shuffle算法
flag = 1; for(i=0,iOut=0,jOut=0;i<sizeof(int)*8;i++) { for(j=0;j<maxLen;j++){ if(vInt[j]&flag) vOutInt[jOut]+=1;
iOut++; if(iOut==sizeof(int)*8) { iOut =0; jOut++; }else vOutInt[jOut]=vOutInt[jOut]<<1; } flag = flag<<1; } //////////////////////////////////////////////////
for(i=0;i<maxLen;i++){ fwrite(&vOutFloat[i], sizeof(unsigned), 1, fd1); fwrite(&vOutInt[i], sizeof(unsigned), 1, fd2); }
fclose(fd); fclose(fd0); fclose(fd1); fclose(fd2); /**************对Int洗牌算法以后的数据进行反算,检查算法是否能够复原********/ flag = 0x80000000; flag2= 0x01; for(i=0,jOut=0;i<sizeof(int)*8;i++) { for(j=0;j<maxLen;j++){ if(vOutInt[jOut]&flag) vTmpInt[j]+=flag2; if(flag==0x01) { jOut++; flag = 0x80000000; }else flag = flag >>1; } flag2 = flag2<<1; }
memcpy(&vPrintInt[0],&vTmpInt[0], maxLen*sizeof(unsigned)); for(i=0;i<maxLen;i++) if(i<10||i>maxLen-10) { printf("%d : %x %x %d\n", i, vOutInt[i], vTmpInt[i], vPrintInt[i]); } }
|