Ваша функция принимает строку, которая, мы надеемся, содержит шестнадцатеричную строку, используя только символы [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.
Объясните на простом английском языке, чего вы пытаетесь достичь, вместо того, чтобы бросать на нас свалку кода и ожидаете, что мы это поймем. –