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