2012-01-07 1 views
1

아래 함수의 반대 인 함수를 작성하려고합니다.다른 자바 스크립트의 역함수 인 자바 스크립트에서 함수 작성하기

그래서 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

단순한 영어로 설명하십시오. 코드 덤프를 우리에게 던지기보다는 우리가 이해하기를 기대합니다. –

답변

3

귀하의 함수는 문자 [0-9a-fA-F]만을 사용하여 16 진수 문자열로 이루어진 문자열을 취합니다. 그런 다음 두 개의 16 진수 문자가 0에서 255 사이의 10 진수로 변환되는 배열을 만듭니다. 그러면이 함수는이 배열에서 처음 131 개의 요소를 즉시 버립니다. 즉, 문자열의 처음 262 자의 문자는 함수의 출력에 영향을주지 않습니다 (처음 262 자는 임의의 문자가 될 수 있음).

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

sliceEnd 0과 65535 사이의 수 (결과 배열의 최대 크기)된다 :

는이 라인이있다. 입력 문자열의 인덱스 262-265에있는 문자를 기반으로합니다. (두 개의 두 자리 16 진수 값이 두 개의 정수로 변환되며, 위치 264의 값에 256이 곱해지고 위치 262의 값에 더해진다).

그런 다음 결과 배열에는 위치 270에서 270 + sliceEnd * 2까지의 문자와 동일한 방법을 사용하여 변환 된 정수가 포함됩니다.

MSN은이 함수가 1 대 1이 아니므로 수학적으로 가역적이지는 않지만, 0에서 255 사이의 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하지만지기 때문이 아닌 속성 bar(foo(x)) === x (X는 전술 한 바와 0과 255 사이 미만 65536 개 정수 배열 인 경우) MSN은 재산이 당신의 업무를 위해 성취하기가 불가능하다고 지적했다.

EG.

"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000117dcb" 당신이 원래의 배열 돌아 함수 foo에 대한 입력으로 제공하는 경우 : bar([17,125,12,11]) 문자열 제공 [17,125,12,11],하지만의이 값을 다른이 될 수있는 다른 많은 입력 (그 0 적어도 268에있다 [0-9a-fA-F]04은 04보다 큰 값이 될 수 있습니다. 이는 22^268 * (255 - 4) 개의 다른 문자열에을 곱한 경우에만 소문자 또는 대문자를 고려하므로 조금 더 곱한 것을 의미합니다.^268은 어쨌든 하나의 출력에 대한 우스운 입력 값이며, 위의 문자열로 시작하는 무한한 양의 문자열과 같은 출력을주는 다른 16 진수 문자열이 추가 된 사실을 무시하고 있습니다. sliceEnd 변수 때문에 foo가 발생했습니다.

+2

실제로 우회전을 찾으려는 노력에 +1 (그리고 그것은 좋은 대답이기 때문에). –

3

이 기능은 1 대 1 기능이 아닙니다. 즉, 많은 입력이 동일한 출력을 생성합니다.

+0

: charList.splice에 대한 호출과 함께 입력 문자열의 일부를 버리고 있습니다. –

+0

그는 문자열의 일부를 버릴 수 있지만 해당 부분을 제거하기위한 패턴이있는 경우에만 되돌릴 수 있습니다. – marcio