如何将JavaScript字符串转换为唯一的数值,以便可以将数值转换回字符串?数值的长度无关紧要。
如果不可能,那么如何将字符串转换为数字值(可逆或不可逆)?
最佳答案
字符串和数字:
字符串可以描述为带有编码的一系列字节。这导致显示字符而不是字节值。
要获取某个字符的字符代码,可以在字符串上调用charCodeAt
方法。
"a".charCodeAt(0); // => 97
"A".charCodeAt(0); // => 65
如您所见,每个字母都有一个数字值及其变体。现在,下一个问题是如何存储这些数字。例如,您不能仅将它们添加在一起,因为:
97 + 65 = 162;
String.fromCharCode(162); // => ¢
最好的解决方案可能是将它们存储在一个数组中,以便以后可以轻松地重新组装它们。
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"
编码字符串值:
现在,您完全有可能希望支持不是数组的东西(一个反射(reflect)整个单词的数字字符串)。为此,您需要与存储集合中最大值3所需的位数一样多。因此,只要我们知道此长度,我们就可以将这些数字推到一个数字中,然后再将它们拉开。
[72, 101, 108, 108, 111].reduce(function(memo, n){
return memo + ("000" + n).slice(-3);
}, "");
// => "072101108108111"
但是您会看到,这不是实数,因为开头的0是有效数字。更常见的是hexadecimal用于存储这些类型的值。请考虑使用
toString
方法将每个数字转换为十六进制,其中参数为基数(数字的基数,十六进制为16)。[72, 101, 108, 108, 111].reduce(function(memo, n){
return memo + ("00" + n.toString(16)).slice(-2);
}, "");
// => "48656c6c6f"
如您所见,这为我们节省了一些字符,因为我们知道4位可以存储在一个基数为16的基数(1111 === 15)中,因此仅使用2个基数为16的基数(16 * 16 = 256)。
要将十六进制代码反转为原始字符串,您只需要将字符串分成两对,然后将它们转换回以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;
}, "");
关于javascript - 如何使用JavaScript将字符串转换为数值(应该是可逆的)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21057156/