2012-01-07 48 views
1

我试图编写一个与以下函数相反的函数。在JavaScript中写入一个与另一个函数相反的函数

这样我就可以从函数foo得到输出并生成输入参数。

我不完全确定是否有可能。

function foo(str){ 
    var hexMap = { 
     "0":0, 
     "1":1, 
     "2":2, 
     "3":3, 
     "4":4, 
     "5":5, 
     "6":6, 
     "7":7, 
     "8":8, 
     "9":9, 
     "A":10, 
     "B":11, 
     "C":12, 
     "D":13, 
     "E":14, 
     "F":15 
    }; 
    var charList = []; 

    str = str.toUpperCase();    


    for (var i = 0; i < str.length; i += 2) { 
     charList.push(hexMap[str.charAt(i)] * 16 + hexMap[str.charAt(i + 1)]); 
    } 

    charList.splice(0, 8); 
    charList.splice(0, 123); 

    var sliceEnd = charList[0] + charList[1] * 256; 
    charList.splice(0, 4); 

    charList = charList.slice(0, sliceEnd); 
    return charList; 
} 
+4

用简单的英文说明,你试图达到什么目的,而不是把代码转储扔给我们,期待我们理解它。 – 2012-01-07 05:52:46

回答

3

您的函数需要一个字符串,希望是一个十六进制字符串,只使用字符[0-9a-fA-F]。然后它创建一个数组,其中每两个十六进制字符都被转换为0到255之间的十进制整数。然后该函数立即抛出该数组中的前131个元素。这意味着字符串中的前262个字符对函数的输出没有影响(前262个字符可以是任何字符)。

然后是这一行:

var sliceEnd = charList[0] + charList[1] * 256; 

sliceEnd变为0和65535之间的数(所得阵列的最大尺寸)。基于输入字符串中索引262 - 265处的字符。 (两个两位数的十六进制值转换为两个整数,位置264处的值乘以256并加到位置262处的值)。

然后生成的数组包含使用相同方法从位置270到270 + sliceEnd * 2中的字符转换的整数。

MSN是正确的,这个函数不是1对1,因此也不是数学上可逆的,但是你可以编写一个函数给定一个小于65536的数组,它可以产生一个输入字符串给foo,回到那个数组。具体有以下功能将做到这一点:

function bar(arr){ 
    var sliceEnd = arr.length; 
    var temp = '00' + (sliceEnd & 255).toString(16); 
    var first = temp.substring(temp.length - 2); 
    temp = '00' + Math.floor(sliceEnd/256).toString(16); 
    var second = temp.substring(temp.length - 2); 
    var str = '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + first + second + '0000'; 
    for(var i = 0; i < arr.length; i++){ 
     temp = '00' + arr[i].toString(16); 
     str += temp.substring(temp.length - 2); 
    } 
    return str; 
} 

这给了你这样的特性:foo(bar(x)) === x(如果x是前面提到小于65536个整数0和255之间的阵列),而不是财产bar(foo(x)) === x因为MSN指出,财产是不可能达到您的功能。

EG。 bar([17,125,12,11])给人的字符串:

"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000117dcb"如果你给它输入到你的函数foo你回到原来的数组:[17,125,12,11],但也有许多其他投入(那些0至少268的可以是任意其他的值的[0-9a-fA-F]04可以是大于04的任何东西,这意味着22^268 *(255-4)个不同的字符串乘以更多,因为它仅考虑小写字母或大写字母,但是不能同时乘以255 - 4。无论22无论如何,^ 268对于一个输出来说是一个荒谬的输入数量,这就是忽略了这样一个事实,即它们是无限数量的字符串,它们以上面的字符串开头,并附加了任何其他十六进制字符串,这些字符串会给出相同的输出因为sliceEnd变量的foo。

+2

+1为努力实际找到一个正确的逆(因为这是一个很好的答案)。 – 2012-01-07 13:01:47

3

该函数不是1对1函数,即许多输入将生成相同的输出。

+0

为了证明:你调用'charList.splice'时会抛弃部分输入字符串。 – 2012-01-07 06:03:59

+0

他可以丢掉部分字符串,但只有在删除该部分的模式时才可逆。 – marcio 2012-01-07 06:12:59