我正在尝试编写一个与下面函数相反的函数。
这样我就可以从函数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;
}
答案 0 :(得分:3)
该函数不是1对1函数,即许多输入将生成相同的输出。
答案 1 :(得分: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 + 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]
,但还有许多其他输入(这些0中至少有268个可以是[0-9a-fA-F]
中的任何其他值,04
可以是大于04的任何值,这意味着22 ^ 268 *(255 - 4)个不同的字符串乘以更多,因为它只考虑小写或大写,但不是两者都乘以255 - 4
。无论22 ^ 268是一个输出的荒谬数量,无论如何,这忽略了它们是无限数量的字符串,从上面的字符串开始的事实并且附加了任何其他十六进制字符串,由于sliceEnd变量,它将从foo提供相同的输出。