繁体   English   中英

如何在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只是执行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 outputValint outputVal的不安全转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM