【问题标题】:How would I undo this code?我将如何撤消此代码?
【发布时间】:2013-12-16 22:00:50
【问题描述】:

s 我在使用此功能时遇到了一些问题。我设法将它从一些汇编代码中反转出来,并让它完美地工作。但我不能做与它相反的事情。这就是我的意思:

这是我的代码

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

如您所见,它执行一个位移位(向右移动 2),对位移位的结果进行与运算,然后通过 bVal(或 12525 字节数组中的第二个字节)对结果进行或运算.

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

我无法将该索引恢复为这样的数字。基本上撤消该代码的作用。

【问题讨论】:

  • 我认为这不可能。但我在等待有人证明我错了:)
  • 如果范围(0..1023)小于域(0..uShort max),那么您肯定知道该函数不可逆,因为多个输入数字必须映射到相同的输出编号。
  • 如果storedVal 的范围比int 更窄会有所帮助。否则,正如上面其他人所指出的那样,这是不可能的。
  • @Bartos 我并不是想将 storeVal 作为一个 int,修复它。 (它不在我的实际代码中)
  • 您总是以storedVal 开头吗?或者您有时会以index 开头?如果您总是从storedVal 派生索引(就像我想象的那样),那么反过来只需引用storedVal

标签: c# function undo


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果输入值为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

    【讨论】:

      【解决方案3】:

      索引中没有足够的信息来恢复原始值。要在此处执行反向操作,您需要知道用于访问索引的 aValbVal,它们没有被存储。在不知道这些的情况下,反向函数有无限的答案。

      【讨论】:

        猜你喜欢
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 2015-07-09
        • 2018-03-01
        相关资源
        最近更新 更多