如何将JavaScript字符串转换为唯一的数值,以便您可以将数值转换回字符串?数值的长度无关紧要.
如果那是不可能的,那么如何将字符串转换为数值(可逆或不可逆)?
字符串可以描述为带编码的一系列字节.这导致显示字符而不是字节值.
要获取某个字符的字符代码,您可以charCodeAt在字符串上调用该方法.
"a".charCodeAt(0); // => 97
"A".charCodeAt(0); // => 65
Run Code Online (Sandbox Code Playgroud)
所以你可以看到每个字母和它的变体都有一个数值.现在下一个问题是如何存储这些数字.例如,您不能只将它们添加到一起,因为:
97 + 65 = 162;
String.fromCharCode(162); // => ¢
Run Code Online (Sandbox Code Playgroud)
最好的解决方案可能是将它们存储在一个数组中,以便以后可以轻松地重新组装.
var StringTools = {
stringToNumbersArray: function(data){
return data.split('').map(function(c){return c.charCodeAt(0);});
},
numbersArrayToString: function(arr){
return arr.map(function(n){return String.fromCharCode(n)}).join('');
}
}
StringTools.stringToNumbersArray("Hello");
// => [72, 101, 108, 108, 111]
StringTools.numbersArrayToString([72, 101, 108, 108, 111])
// => "Hello"
Run Code Online (Sandbox Code Playgroud)
现在,你完全有可能想要支持不是数组的东西(反映整个单词的单个数字串).要做到这一点,你需要尽可能多的数字来存储集合中最大的值,即3.所以我们可以将这些数字一起推送到一个数字,只要我们知道这个长度,我们可以稍后将它们分开.
[72, 101, 108, 108, 111].reduce(function(memo, n){
return memo + ("000" + n).slice(-3);
}, "");
// => "072101108108111"
Run Code Online (Sandbox Code Playgroud)
但是你可以看到这不是一个实数,因为开头的0是一个重要的数字.更常见的是十六进制用于存储这些类型的值.考虑使用toString参数为基数的方法(数字的基数,16为十六进制),可以将每个数字转换为十六进制.
[72, 101, 108, 108, 111].reduce(function(memo, n){
return memo + ("00" + n.toString(16)).slice(-2);
}, "");
// => "48656c6c6f"
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,这为我们节省了一些字符,因为我们知道4位可以存储在一个基数为16的数字中(1111 === 15),所以你只需要使用2个16位数就可以获得完整的存储字节数(16*16 = 256).
要将十六进制代码反转为原始字符串,您只需要将字符串拆分为2对并将它们转换回基数10,然后使用String.fromCharCode()结果来获取每个字符.
"48656c6c6f".split("").reduce(function(result, c, idx, list){
if (idx % 2 != 0) {
result += String.fromCharCode(parseInt(list[idx-1] + c, 16));
}
return result;
}, "");
Run Code Online (Sandbox Code Playgroud)