Reminiscence

感情の残骸

近況です

暇すぎる

function btoa(bin){
  //Base64テーブル
  //英(大|小)文字&数字&記号二種(+/)
  var table = 'ABCDEFGHJIKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  var res = ''
  while(bin.length !== 0){
    //24bitごとに区切る
    var chunk = bin.slice(0, 3)
    var bits = 0
    for(var i = 0; i < chunk.length; i += 1){
      bits += chunk.charCodeAt(i) << 16 - (8 * i)
    }
    //出力文字数は入力+1
    var outlen = chunk.length + 1
    //6bitごとに区切ってテーブルを元に符号化
    for(var i = 0; i < outlen; i += 1){
      res += table.charAt(bits >> 18 - (6 * i) & 63)
    }
    //パディング
    for(var i = 0; i < 4 - outlen; i += 1){
      res += '='
    }
    bin = bin.slice(3)
  }
  return res
};

function atob(asc){
  //パディングの除去
  asc = asc.replace(/=/g,'')
  var table = 'ABCDEFGHJIKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  var res = ''
  while(asc.length !== 0){
    //24bitごとに区切る
    var chunk = asc.slice(0, 4)
    var bits = 0
    //テーブルを元に復号化
    for(var i = 0; i < chunk.length; i += 1){
      bits += table.indexOf(chunk.charAt(i)) << 18 - (6 * i)
    }
    //符号化の逆なので-1
    var outlen = chunk.length - 1
    //8bitごとに区切って元のデータに戻す
    for(var i = 0; i < outlen; i += 1){
      res += String.fromCharCode(bits >> 16 - (8 * i) & 255)
    }
    asc = asc.slice(4)
  }
  return res
};

console.log(btoa('nk0t'))
console.log(atob('bmswdA=='))
console.log('nk0t' === atob(btoa('nk0t')))

大体古いIEにatobとbtoaが無いのが悪いし古いIEを使わせられる環境が悪いし金かかるOSは仕方ないとは思うが(仕方なくはない)ブラウザくらい入れ替えろという話