6

注意:我发现了一个类似的问题,但它是在 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...
    )
}

这不仅会非常耗时,而且我不知道如何将其转换回来,因为一旦我输入像11for这样的数字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

实际上,我确实花了几分钟时间手动将“牛奶”、“鸡蛋”和“面包”加密到它们的 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 不被黑客攻击或其他东西可能很有用。

例如,使用我在这里制作的示例,我制作了这个消息21173b2x3030172t2p38173d333936172u2p2r2t以及这个ЎDŽ̺ǦDŽ̌。如果你设法解码第二个,那么也解码这个ʒ̴ͻϮ

不过,这不是很实用,所以我最终可能会使用Ragnarokkr链接到的库。

谢谢大家的回复!

4

2 回答 2

8

尝试这个:

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;
}

尝试演示:http: //jsfiddle.net/hGKAg/3/

于 2013-01-15T21:10:58.720 回答
1

虽然我以前从未使用过它,但我的一个朋友给了这个库一个很好的评价。显然,您可以使用此库的任何基本标准对字符串进行编码:

Nibbler.js

于 2013-01-15T21:12:42.973 回答