我想编写一个将字符串编码/解码为int值的函数。这样做的目的是使我可以使用我编写的仅限于整数的RSA加密/解密方法对文本进行加密。
基本上我想要的是这样的
expires_in
答案 0 :(得分:0)
您遇到的主要问题是,应逐字符编码,而不要尝试对整个字符串的数字表示进行编码
字符串是使用某些字符编码的字符序列。字符可以用整数表示,因此您可以将这些整数连接起来,并生成代表整个字符串的整数。但是结果整数的大小将无法处理。
我将介绍如果您尝试将字符串转换为数字表示形式(带有适当填充的字符代码序列)会发生什么情况
如果使用str.charCodeAt(index)
将每个字符转换成其UTF-16数字表示形式(可以表示0到65535(5位数字)的值),则会得到具有不同长度的数字。
例如:'a'.charCodeAt(0) = 97
// 2位数字
例如:'w'.charCodeAt(0) = 119
// 3位数字
每个字符表示形式必须具有相同的长度,因此必须转换回字符串,有时还使用零(0)加上一些填充前缀。
例如:97 = '00097'
//长度:5
例如:119 = '00119'
//长度:5
如果将这些填充的charCodes连接起来,则会得到一个长数字字符串,可以将其转换回Integer。
例如:'aw' = '0009700119'
=> Number('0009700119') = 9700119
此时,您应该已经能够看到遇到的问题: Number.MAX_SAFE_INTEGER
超过3个字符的字符串会产生意外结果...
function encode(myString){
let resultStr = '';
for(let i=0; i<myString.length;i++){
let str = String(myString.charCodeAt(i));
for(let a=0;a<5-str.length;a++) resultStr+=0;
resultStr+=str;
}
return Number( resultStr );
}
function decode(myInt){
let myIntStr = String(myInt);
let padding = 5- (myIntStr.length % 5);
for(let i=0; i < padding; i++){
myIntStr = '0' + myIntStr;
}
let chars = myIntStr.match(new RegExp('.{1,'+5+'}(?=(.{'+5+'})+(?!.))|.{1,'+5+'}$', 'g'))
let myStr ='';
for(let i=0; i < chars.length; i++){
myStr += String.fromCharCode( chars[i] );
}
return myStr;
}
let myString= window.prompt('insert string to encode');
let encoded = encode(myString);
console.log('Encoded:', encoded )
let decoded = decode(encoded);
console.log('Decoded:', decoded)
字符串越长,得到的整数越大。并且您将快速达到JavaScript中可以表示的最大值。