[英]How do I reverse the following algorithm in C
我有以下算法:
unsigned long specialNum=0x4E67C6A7;
unsigned int ch;
char inputVal[]=" AAPB2GXG";
for(int i=0;i<strlen(inputVal);i++)
{
ch=inputVal[i];
ch=ch+(specialNum*32);
ch=ch+(specialNum/4);
specialNum=bitXor(specialNum,ch);
}
int outputVal=specialNum;
bitXor只是执行Xor操作:
int bitXor(int a,int b)
{
return (a & ~b) | (~a & b);
}
现在我想逆转算法 。 给定outputVal,我想获取inputVal。 这是我到目前为止所做的。 但这不起作用:(
while(outputVal!=0x4E67C6A7)
{
ch=bitXor(outputVal,0x4E67C6A7);
outputVal=outputVal-(ch*4);
outputVal=outputVal-(ch/32);
inputVal[i++]=(char)ch;
if(i>32)
break;
}
编辑:好的,同意不可能。 但是我想知道为什么我的问题没有被采纳。 在发布之前,我已经遵循了指导原则,我认为这个问题对于投票否定来说不是太糟糕。
在请求的“反向”算法中,您要求将4字节数字转换为任意长度的字符串。 显然不可能,因为假设您正在这样做,那么您已经发明了一种最终的压缩算法。
您所要求的“反向算法”是不可能的。 您的示例inputVal
是一个长度超过30个字母的字符串。 您的outputVal
为4或8个字节。 信息理论指出,如果n> k,则不可能将任意的n字节字符串存储到k字节字符串中。
你前进的算法基本上是位压缩从数组值inputVal
入标量specialNum
处于一种尴尬的方式。
另外,最后有从unsigned long specialNum
int outputVal
到int outputVal
的不安全转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.