如何在 C 中反转以下算法
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 只是做异或运算:
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;
}
编辑:好的,同意这是不可能的。但我想知道为什么我的问题被否决了。我在发帖前遵循了指南,我认为这个问题不至于太糟糕,不能投票。
在请求的 "reversed" 算法中,您要求将 4 字节数字转换为任意长度的字符串。这显然是不可能的,因为假设你这样做,你已经发明了一种终极压缩算法。
你要求的"reverse algorithm"是不可能的。你的例子 inputVal
是一个长度超过 30 个字母的字符串。您的 outputVal
最多为 4 或 8 个字节。信息论表明,如果 n > k,则不可能将任意 n 字节字符串存储到 k 字节字符串中。
你的前向算法基本上是以一种笨拙的方式将数组 inputVal
中的值打包到标量变量 specialNum
中。
此外,最后有一个从 unsigned long specialNum
到 int outputVal
的不安全转换。
我有以下算法:
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 只是做异或运算:
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;
}
编辑:好的,同意这是不可能的。但我想知道为什么我的问题被否决了。我在发帖前遵循了指南,我认为这个问题不至于太糟糕,不能投票。
在请求的 "reversed" 算法中,您要求将 4 字节数字转换为任意长度的字符串。这显然是不可能的,因为假设你这样做,你已经发明了一种终极压缩算法。
你要求的"reverse algorithm"是不可能的。你的例子 inputVal
是一个长度超过 30 个字母的字符串。您的 outputVal
最多为 4 或 8 个字节。信息论表明,如果 n > k,则不可能将任意 n 字节字符串存储到 k 字节字符串中。
你的前向算法基本上是以一种笨拙的方式将数组 inputVal
中的值打包到标量变量 specialNum
中。
此外,最后有一个从 unsigned long specialNum
到 int outputVal
的不安全转换。