2012-01-07 4 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

Объясните на простом английском языке, чего вы пытаетесь достичь, вместо того, чтобы бросать на нас свалку кода и ожидаете, что мы это поймем. –

ответ

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 + срезEnd * 2.

MSN верный, что эта функция не от 1 до 1 и, следовательно, не является математически обратимой, но вы можете написать функцию, которая задала массив из менее 65536 целых чисел от 0 до 255, может генерировать входную строку для 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 (если х представляет собой массив менее 65536 целых чисел от 0 до 255, как было указано выше), но не является собственностью bar(foo(x)) === x, потому что, как MSN указал, что свойство невозможно достичь для вашей функции.

EG. bar([17,125,12,11]) дает строку:

"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000117dcb" который, если вы даете в качестве входных данных для вашей функции foo вы получите обратно оригинальный массив: [17,125,12,11], но есть много других входов (по крайней мере, 268 из них 0 может быть любой другой из значений в [0-9a-fA-F], а 04 может быть чем-то большим, чем 04, что означает 22^268 * (255-4) разные строки, умноженные на бит больше, поскольку это учитывает только строчные буквы или капители, но не оба при умножении на 255 - 4.^268 - это смехотворное количество входов для одного выхода в любом случае, и это игнорирует тот факт, что они представляют собой бесконечное количество строк, которые начинаются со строки выше и содержат к ним любую другую шестнадцатеричную строку, которая будет давать тот же вывод из foo из-за переменной sliceEnd.

+2

+1 для усилия, чтобы найти правильное обратное (и потому, что это хороший ответ). –

3

Эта функция не является функцией от 1 до 1, то есть многие входы будут генерировать один и тот же выход.

+0

Чтобы оправдать: вы выбрасываете части входной строки с вашими вызовами в 'charList.splice'. –

+0

он может выбросить части строки, но он будет обратимым только в том случае, если есть шаблон для удаления этих частей. – marcio

 Смежные вопросы

  • Нет связанных вопросов^_^