我如何在C中反转以下算法

How do I reverse the following algorithm in C

本文关键字:算法      更新时间:2023-10-16

我有以下算法:

    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);
}

现在我要反转算法。给定了输出值,我想要得到输入值。这就是我到目前为止所做的。但它不工作:(

    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 specialNumint outputVal的不安全转换。