我该如何撤消此代码?

时间:2013-12-01 00:12:02

标签: c# function undo

我现在有点麻烦这个功能了。我设法将其从一些汇编代码中撤消,并使其完美地工作。但我不能做它所做的相反的事情。这就是我的意思:

这是我的代码

ushort storedVal = 12525; //Value to extract actual index out of
byte[] block = BitConverter.GetBytes(storedVal);
uint aVal = block[0];
uint bVal = block[1];
uint index = Convert.ToUInt32((aVal >> 2) & 0x300) | bVal; //Extracting actual index

正如你所看到的,它执行Bitshift(向右移动2),在bitshift上的结果上执行AND,然后通过bVal(或12525的字节数组中的第二个字节)对结果执行OR运算

存储在索引中的结果是表/列表的索引。在这种情况下,它是48 /

我无法将索引重新变成这样的数字。基本上撤消代码的作用。

3 个答案:

答案 0 :(得分:1)

索引中没有足够的信息可以恢复到原始值。要在此处执行操作的反向操作,您需要知道用于到达索引的aValbVal,这些索引不会被存储。不知道这些,反向函数有无限的答案。

答案 1 :(得分:1)

如果输入值为ushort,那么您可以使用暴力方法轻松找到参数的原像。但是,由于该功能不可逆,您可能会获得多个结果:

public static uint getIndex(ushort value)
{
    byte[] block = BitConverter.GetBytes(value);
    uint aVal = block[0];
    uint bVal = block[1];
    return  Convert.ToUInt32((aVal >> 2) & 0x300) | bVal;
}

public static void Main()
{
    uint givenIndex = 192;

    for (ushort i = ushort.MinValue;;++i)
    {
        if (givenIndex == getIndex(i))
        {
            Console.WriteLine("Possible input: " + i);
        }

        if (i == ushort.MaxValue)
        {
            break;
        }
    }
}

另请注意,对于某些参数,您不会得到任何结果,因为该函数也不是surjection

答案 2 :(得分:0)

您的代码中存在错误,或者您错误地转录了错误。 aVal是一个字节,因此(aVal >> 2) & 0x300始终为零。这意味着indexbVal具有相同的值,storedVal(storedVal >> 8)的第一个字节。这意味着您可以将整个函数重写为{{1}}。因此,给定此函数的返回值,您可以轻松确定输入的一个字节,但另一个字节可能是任何字节(因为它不会影响输出)。