6

注:同様の質問を見つけましたが、Pythonにあります。


私はこれのためのアルゴリズムまたはネイティブメソッドを考えようとしてきました、そして私は困惑しています。

これは私がこれまでに持っているものです:

encode=function(n,f){
    return (n).toString(f)
}
decode=function(s,f){
    return parseInt(s,f)
}

基本的に、文字列を'Hello World!'基数10(16進数でも機能します)のような数値に変換する方法が必要です。次の14438792758793754875ような時間を無駄にする前に、適切な方法があるかどうか疑問に思っています。

str='Hello World'
returnString=''
for(var i in str){
    returnString+=(
        str[i]=='A'?'0'
        :str[i]=='B'?'1'
        etc...
    )
}

これは非常に時間がかかるだけでなく、forのような数値に入ると、forループは実行されず、を返すため、どのように変換して戻すことができるかわかり11ませLBB

私がこれを求めている理由は、将来、より効率的で安全な暗号化されたストレージに使用する予定だからです。たとえば、次のようなものです。

//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文字列から16進文字列を生成する関数を提供し、必要に応じてリバースエンジニアリングして、次のようにしました。

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Ž̌。そして、2番目のものをデコードすることができたら、これもデコードしますʒ̴ͻϮ

ただし、これはあまり実用的ではないため、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

私はこれまでこれを使用したことがありませんが、私の友人がこのライブラリに良いレビューを与えました。どうやら、このライブラリで任意のBase標準を使用して文字列をエンコードできます。

Nibbler.js

于 2013-01-15T21:12:42.973 に答える