Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- String.prototype.lstrip = function (char) {
- return this.replace(new RegExp('^'+char+'+'), '')
- }
- function reverseBin (n) {
- return BigInt('0b' + n.toString(2).padStart(64, '0').split('').map(e => e === '0' ? '1' : '0').join(''))
- }
- class B32 {
- static encode (num, numerals="0123456789ABCDEFGHIJKLMNOPQRSTUV") {
- num = BigInt(num)
- return ((num == 0n) && numerals[0]) || (B32.encode(num / 32n, numerals).lstrip(numerals[0]) + numerals[num % 32n])
- }
- static decode (b32Str, numerals="0123456789ABCDEFGHIJKLMNOPQRSTUV") {
- return b32Str.split('').reduce((ac, cv, i, a) => ac + BigInt(numerals.indexOf(cv)) * (32n ** BigInt(a.length - (i + 1))), 0n).toString()
- }
- }
- function v1ToV2 (v1, reverse) {
- let res = 0n
- let intV1 = BigInt(v1)
- if (reverse)
- intV1 = reverseBin(intV1) + 1n
- for (let i = 0; i < 8; i++) {
- res <<= 8n
- res |= intV1 & 0xffn
- intV1 >>= 8n
- }
- res <<= 1n
- return B32.encode(res).padStart(13, '0').padEnd(16, 'Z')
- }
- function v2ToV1 (v2) {
- v2 = v2.replace(/Z+$/, '')
- let decodedV2 = BigInt(B32.decode(v2))
- let intV2 = decodedV2 >> 1n
- let res = 0n
- for (let i = 0; i < 8; i++) {
- res <<= 8n
- res |= intV2 & 0xffn
- intV2 >>= 8n
- }
- if (res & (2n ** 63n))
- res = reverseBin(res) + 1n
- return res.toString()
- }
- /**
- * 11110011 01010000 11000110 001
- * 00001100 10101111 00111001 110
- * 11100101 01111001 011001110
- * 11111111 11111111 11111111 11111111 11111111111001010111100111001111
- * 11110011 10011110 10100111 11111111 11111111111111111111111111111111
- * 11001111 01111001 01100101 11111000 111111111111111111111111111111110
- * 11001111 01111001 11100101 11111111 111111111111111111111111111111110
- */
- //SOADUTK00PFHEZZZ 1111111111111111111111111111111111111000011001010111100111001111
- //console.log(v1ToV2(127567409))
- //console.log(v1ToV2('1684071934479766758'))
- //console.log(v2ToV1('PTSMBU7VVVVVUZZZ'))
- //console.log(v2ToV1('6639K1O000000ZZZ'))
- //console.log(v1ToV2('127567409', true))
- let exV1 = '1686614667972415444'
- let exV2 = 'QI7NBF8Q1TK1EZZZ'
- let exV2rev = '5HO8KGN5U2BUGZZZ'
- console.assert(v1ToV2(exV1) === exV2, `v1ToV2('${exV1}') should return '${exV2}'`)
- console.assert(v1ToV2(exV1, true) === exV2rev, `v1ToV2('${exV1}', true) should return '${exV2rev}'`)
- console.assert(v2ToV1(exV2) === exV1, `v2ToV1('${exV2}') should return '${exV1}'`)
- console.assert(v2ToV1(exV2rev) === exV1, `v2ToV1('${exV2rev}') should return '${exV1}'`)
Add Comment
Please, Sign In to add comment