我现在有点麻烦这个功能了。我设法将其从一些汇编代码中撤消,并使其完美地工作。但我不能做它所做的相反的事情。这就是我的意思:
这是我的代码
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 /
我无法将索引重新变成这样的数字。基本上撤消代码的作用。
答案 0 :(得分:1)
索引中没有足够的信息可以恢复到原始值。要在此处执行操作的反向操作,您需要知道用于到达索引的aVal
和bVal
,这些索引不会被存储。不知道这些,反向函数有无限的答案。
答案 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
始终为零。这意味着index
与bVal
具有相同的值,storedVal
是(storedVal >> 8)
的第一个字节。这意味着您可以将整个函数重写为{{1}}。因此,给定此函数的返回值,您可以轻松确定输入的一个字节,但另一个字节可能是任何字节(因为它不会影响输出)。