注意:我找到了similar question,但它在python中。
<小时/> 我一直试图想到一个算法或本机方法,我很难过。
这是我到目前为止所做的:
encode=function(n,f){
return (n).toString(f)
}
decode=function(s,f){
return parseInt(s,f)
}
基本上,我需要一种方法将字符串(如'Hello World!'
)转换为基数10(十六进制也可以)的数字,如14438792758793754875
,我想知道是否有正确的方法在我浪费我的时间之前做这件事:
str='Hello World'
returnString=''
for(var i in str){
returnString+=(
str[i]=='A'?'0'
:str[i]=='B'?'1'
etc...
)
}
这不仅耗费时间,而且我不知道如何将其转换回来,因为一旦我为11
进入L
之类的数字,for循环就不会做,并将返回BB
。
我之所以这样问是因为我计划将来使用它来获得更高效,更安全的加密存储。例如,像:
//save
numstr=encodeToNumber(inputElement.value)
b36str=encode(numstr,36)
storage['items'].push(b36str)
localStorage['App Data']=JSON.stringify(storage)
//load
if(localStorage['App Data']){
storage=JSON.parse(localStorage['App Data'])
}else{
storage={
items:[],
config:{
etc
}
}
}
//Assuming storage.items looks like this: ['rgie', 'zyy', '2il7']
for(i in storage['items']){
b36str=storage['items']//rgie, zyy, 2il7
numstr=decode(b36str,36)//1281110, 46618, 117403
container.innerHTML+='<hr>'+decodeFromNumber(numstr)//Milk, Eggs, Bread
}
//Output
Milk
Eggs
Bread
我实际上花了几分钟手动加密'Milk','Eggs'和'Bread'到他们的base36对应物,所以它可以准确。
更新:Aadit M Shaw
提供了一个从字符串中生成十六进制字符串的函数,然后根据我的需要对其进行反向设计并得到了这个:
en=function(s){
var s2d=function(s){
s=s.replace(/ /g,'+').replace(/!/g,'.')
var n=[]
for(var i in s){
n.push(s.charCodeAt(i))
}
return n
}
var arr=s2d(s)
var s2=''
for (var i in arr){
s2+=arr[i].toString(36)
}
return s2
}
de=function(s){
var arr=s.split(/(..)/)
var arr2=[]
var s2=''
for(var i in arr){
if(arr[i]){
arr2.push(parseInt(arr[i],36))
}
}
for(var i in arr2){
s2+=String.fromCharCode(arr2[i])
}
return s2.replace(/\+/g,' ')
}
虽然编码的字符串比我想要的大,但它可能有助于保护cookie不被黑客入侵。
例如,使用我制作here的示例,我发送了此消息21173b2x3030172t2p38173d333936172u2p2r2t
以及此ЎDŽ̺ǦDŽ̌
。如果你设法解码第二个,那么也解码它ʒ̴ͻϮ
这不太实用,所以我可能最终会使用我链接的库Ragnarokkr
。
谢谢大家的回复!
答案 0 :(得分:6)
试试这个:
function encode(string) {
var number = "0x";
var length = string.length;
for (var i = 0; i < length; i++)
number += string.charCodeAt(i).toString(16);
return number;
}
请参阅此处的演示:http://jsfiddle.net/hGKAg/2/
解码就是这么简单:
function decode(number) {
var string = "";
number = number.slice(2);
var length = number.length;
for (var i = 0; i < length;) {
var code = number.slice(i, i += 2);
string += String.fromCharCode(parseInt(code, 16));
}
return string;
}
答案 1 :(得分:1)
虽然我之前从未使用过这个,但我的一位朋友给了这个图书馆很好的评价。显然,您可以使用此库使用任何Base标准对字符串进行编码: