Javascript:如何将字符串(例如:“ foo bar”)编码为int表示形式?

时间:2018-08-02 20:22:43

标签: javascript encode

我想编写一个将字符串编码/解码为int值的函数。这样做的目的是使我可以使用我编写的仅限于整数的RSA加密/解密方法对文本进行加密。

基本上我想要的是这样的

expires_in

1 个答案:

答案 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


演示实现:encode()/ decode()

超过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中可以表示的最大值。