2013-01-15 43 views
5

Lưu ý: Tôi tìm thấy một số similar question, nhưng nó nằm trong python. Có cách nào để chuyển đổi chuỗi thành số 10 cơ sở để mã hóa không?


Tôi đã cố gắng nghĩ về một thuật toán hoặc phương pháp gốc cho điều này, và tôi đang bối rối.

Đây là những gì tôi có cho đến nay:

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

Về cơ bản, tôi cần một cách để chuyển đổi một chuỗi, như 'Hello World!' đến một căn cứ 10 (hệ thập lục phân sẽ làm việc tốt) số, như 14438792758793754875, và tôi đang tự hỏi nếu có một cách thích hợp để làm điều đó trước khi tôi có thể lãng phí thời gian của tôi với một cái gì đó như:

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

không chỉ vậy sẽ rất tốn thời gian, nhưng tôi không có ý tưởng làm thế nào tôi có thể sẽ chuyển đổi nó trở lại, như một khi tôi nhận được các con số như 11 cho L, vòng lặp for sẽ không thực hiện và sẽ trả lại BB.

Lý do tôi yêu cầu điều này là vì tôi dự định sử dụng nó trong tương lai để lưu trữ được mã hóa và bảo mật hiệu quả hơn và an toàn hơn. ví dụ:

//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 

Tôi thực sự đã dành vài phút mã hóa thủ công 'Sữa', 'Trứng' và 'Bánh mì' cho các đối tác base36 để có thể chính xác.


Cập nhật: Aadit M Shaw đã đưa ra một chức năng mà tạo ra chuỗi thập lục phân từ chuỗi, và tôi đảo ngược thiết kế nó cho nhu cầu của tôi và nhận điều này:

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,' ') 
} 

Trong khi chuỗi mã hóa lớn hơn tôi đã có thể thích , nó có thể hữu ích cho việc bảo vệ cookie khỏi bị tấn công hoặc một cái gì đó.

Ví dụ: sử dụng ví dụ tôi đã thực hiện here, tôi đã thực hiện thông báo này 21173b2x3030172t2p38173d333936172u2p2r2t cũng như ЎDŽ̺ǦDŽ̌ này. Và nếu bạn quản lý để giải mã thứ hai, sau đó giải mã này quá ʒ̴ͻϮ

Điều này không thực tế lắm, vì vậy tôi có thể sẽ sử dụng thư viện Ragnarokkr liên kết với tôi.

Cảm ơn tất cả các bạn đã trả lời!

+0

Xác định "mật mã": Tại sao không chỉ mã hóa nó? –

+0

@Đã không chắc tôi hiểu câu hỏi của bạn. Nếu bạn hỏi tại sao tôi không chỉ sử dụng phương thức 'encode' mà tôi cung cấp, đó là vì nó chỉ chấp nhận 10 số nguyên cơ sở. –

+3

Nếu bạn muốn một cái gì đó an toàn, một cái gì đó tầm thường như thế này là vô ích. Tôi hỏi tại sao bạn không chỉ sử dụng mã hóa thực tế thay vì cố gắng tự mình thực hiện điều gì đó? Tôi không hiểu bình luận của bạn về "số nguyên cơ bản 10", bạn nói nó có thể là hex - đó là nó? –

Trả lời

6

Hãy thử điều này:

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

Xem demo ở đây: http://jsfiddle.net/hGKAg/2/

giải mã chỉ là đơn giản:

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

Hãy thử demo: http://jsfiddle.net/hGKAg/3/

+0

Tôi không thể sử dụng '8.752161808888254e + 25' (những gì tôi nhận được từ việc nhập' Hello World') –

+0

@ B1KMusic - Tôi đã cập nhật câu trả lời. Vì bạn không nhớ hệ thập lục phân, điều này sẽ giải quyết vấn đề của bạn. –

+0

Umm, tôi vẫn nhận được '8.752161808888254e + 25' khi tôi chuyển đổi chuỗi thập lục phân về số thập phân. –

1

Trong khi tôi đã chưa bao giờ sử dụng điều này trước đây, một người bạn của tôi đã cho thư viện này một goo d xem xét.Rõ ràng, bạn có thể mã hóa chuỗi sử dụng bất kỳ tiêu chuẩn cơ sở với thư viện này:

Nibbler.js

Các vấn đề liên quan