richie3366

cursors converter

Dec 21st, 2020 (edited)
1,341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. String.prototype.lstrip = function (char) {
  2.   return this.replace(new RegExp('^'+char+'+'), '')
  3. }
  4.  
  5. function reverseBin (n) {
  6.   return BigInt('0b' + n.toString(2).padStart(64, '0').split('').map(e => e === '0' ? '1' : '0').join(''))
  7. }
  8.  
  9. class B32 {
  10.  
  11.   static encode (num, numerals="0123456789ABCDEFGHIJKLMNOPQRSTUV") {
  12.     num = BigInt(num)
  13.     return ((num == 0n) && numerals[0]) || (B32.encode(num / 32n, numerals).lstrip(numerals[0]) + numerals[num % 32n])
  14.   }
  15.  
  16.   static decode (b32Str, numerals="0123456789ABCDEFGHIJKLMNOPQRSTUV") {
  17.     return b32Str.split('').reduce((ac, cv, i, a) => ac + BigInt(numerals.indexOf(cv)) * (32n ** BigInt(a.length - (i + 1))), 0n).toString()
  18.   }
  19.  
  20. }
  21.  
  22. function v1ToV2 (v1, reverse) {
  23.  
  24.   let res = 0n
  25.   let intV1 = BigInt(v1)
  26.  
  27.   if (reverse)
  28.     intV1 = reverseBin(intV1) + 1n
  29.  
  30.   for (let i = 0; i < 8; i++) {
  31.     res <<= 8n
  32.     res |= intV1 & 0xffn
  33.     intV1 >>= 8n
  34.   }
  35.  
  36.   res <<= 1n
  37.  
  38.   return B32.encode(res).padStart(13, '0').padEnd(16, 'Z')
  39.  
  40. }
  41.  
  42. function v2ToV1 (v2) {
  43.  
  44.   v2 = v2.replace(/Z+$/, '')
  45.   let decodedV2 = BigInt(B32.decode(v2))
  46.   let intV2 = decodedV2 >> 1n
  47.   let res = 0n
  48.  
  49.   for (let i = 0; i < 8; i++) {
  50.     res <<= 8n
  51.     res |= intV2 & 0xffn
  52.     intV2 >>= 8n
  53.   }
  54.  
  55.   if (res & (2n ** 63n))
  56.     res = reverseBin(res) + 1n
  57.  
  58.   return res.toString()
  59.  
  60. }
  61.  
  62. /**
  63.  * 11110011 01010000 11000110 001
  64.  * 00001100 10101111 00111001 110
  65.  * 11100101 01111001 011001110
  66.  * 11111111 11111111 11111111 11111111 11111111111001010111100111001111
  67.  * 11110011 10011110 10100111 11111111 11111111111111111111111111111111
  68.  * 11001111 01111001 01100101 11111000 111111111111111111111111111111110
  69.  * 11001111 01111001 11100101 11111111 111111111111111111111111111111110
  70.  */
  71.  
  72. //SOADUTK00PFHEZZZ 1111111111111111111111111111111111111000011001010111100111001111
  73. //console.log(v1ToV2(127567409))
  74. //console.log(v1ToV2('1684071934479766758'))
  75.  
  76. //console.log(v2ToV1('PTSMBU7VVVVVUZZZ'))
  77. //console.log(v2ToV1('6639K1O000000ZZZ'))
  78. //console.log(v1ToV2('127567409', true))
  79.  
  80. let exV1 = '1686614667972415444'
  81. let exV2 = 'QI7NBF8Q1TK1EZZZ'
  82. let exV2rev = '5HO8KGN5U2BUGZZZ'
  83.  
  84. console.assert(v1ToV2(exV1) === exV2, `v1ToV2('${exV1}') should return '${exV2}'`)
  85. console.assert(v1ToV2(exV1, true) === exV2rev, `v1ToV2('${exV1}', true) should return '${exV2rev}'`)
  86. console.assert(v2ToV1(exV2) === exV1, `v2ToV1('${exV2}') should return '${exV1}'`)
  87. console.assert(v2ToV1(exV2rev) === exV1, `v2ToV1('${exV2rev}') should return '${exV1}'`)
  88.  
Add Comment
Please, Sign In to add comment