Написание функции в javascript, которая противоположна другой - PullRequest
1 голос
/ 07 января 2012

Я пытаюсь написать функцию, обратную к приведенной ниже функции.

Чтобы я мог получить вывод из функции foo и сгенерировать ее входной параметр.

IЯ не совсем уверен, если это возможно.

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;
}

Ответы [ 2 ]

3 голосов
/ 07 января 2012

Ваша функция принимает строку, которая, как мы надеемся, является шестнадцатеричной строкой, использующей только символы [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 целых чисел между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 (если 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. Независимо от того, что 22 ^ 268 - это нелепое количество входов для одного выхода в любом случае, и это игнорирует тот факт, что они представляют собой бесконечное количество строк, которые начинаются со строки выше и имеютлюбая другая шестнадцатеричная строка, добавленная к ним, которая выдаст тот же вывод из foo из-за переменной sliceEnd.

3 голосов
/ 07 января 2012

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

...