我有以下算法:
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;
}
编辑:好的,同意不可能。但我想知道为什么我的问题被低估了。我在发布之前已经遵循了这些指导原则,我认为这个问题太糟糕了,不能用它来贬低它。
答案 0 :(得分:4)
在请求的“反向”算法中,您要求将4字节数转换为任意长度的字符串。这显然是不可能的,因为假设你这样做,你发明了一种终极压缩算法。
答案 1 :(得分:2)
&#34;反向算法&#34;你要求的是不可能的。您的示例inputVal
是一个超过30个字母的字符串。您的outputVal
最多只有4或8个字节。信息理论规定,如果n> 1,则不可能将任意n字节串存储到k字节串中。 ķ。
您的前向算法基本上是将数组inputVal
中的值打包到标量变量specialNum
中,这是一种尴尬的方式。
此外,最后还存在从unsigned long specialNum
到int outputVal
的不安全转换。