Created
October 17, 2022 15:25
-
-
Save teidesu/05e861d3309356a2b71d17f22a087108 to your computer and use it in GitHub Desktop.
hex и base64? нет, блин, НЁХ и БАЗА76
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// не бейте за кринж код, писала на коленке по фану | |
const HEX_ALPHABET = '0123456789абвгде' | |
const B76_ALPHABET = | |
'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789' | |
function toНёх(buf) { | |
let ret = '' | |
for (let i = 0; i < buf.length; i++) { | |
const byte = buf[i] | |
ret += HEX_ALPHABET[byte >> 4] + HEX_ALPHABET[byte & 0b1111] | |
} | |
return ret | |
} | |
function fromНёх(str) { | |
let ret = [] | |
for (let i = 0; i < str.length; i += 2) { | |
const idx = HEX_ALPHABET.indexOf(str[i]) | |
const idx2 = HEX_ALPHABET.indexOf(str[i + 1]) | |
if (idx === -1 || idx2 === -1) | |
throw new Error('неправильная НЁХ строка!!!') | |
ret.push((idx << 4) | idx2) | |
} | |
return Buffer.from(ret) | |
} | |
function toБаза76(buf) { | |
const toChar = (it) => { | |
if (it === -1) return '=' | |
if (it >= 76) return '+' + B76_ALPHABET[it - 76] | |
return B76_ALPHABET[it] | |
} | |
let ret = '' | |
for (let i = 0; i < buf.length; i += 7) { | |
let a = buf[i] >> 1 | |
let b = ((buf[i] & 0b1) << 6) | ((buf[i + 1] ?? 0) >> 2) | |
let c = (((buf[i + 1] ?? 0) & 0b11) << 5) | ((buf[i + 2] ?? 0) >> 3) | |
let d = (((buf[i + 2] ?? 0) & 0b111) << 4) | ((buf[i + 3] ?? 0) >> 4) | |
let e = (((buf[i + 3] ?? 0) & 0b1111) << 3) | ((buf[i + 4] ?? 0) >> 5) | |
let f = (((buf[i + 4] ?? 0) & 0b11111) << 2) | ((buf[i + 5] ?? 0) >> 6) | |
let g = (((buf[i + 5] ?? 0) & 0b111111) << 1) | ((buf[i + 6] ?? 0) >> 7) | |
let h = (buf[i + 6] ?? 0) & 0b1111111 | |
// in case of padding | |
if (i + 7 > buf.length) h = -1 | |
if (i + 6 > buf.length) g = -1 | |
if (i + 5 > buf.length) f = -1 | |
if (i + 4 > buf.length) e = -1 | |
if (i + 3 > buf.length) d = -1 | |
if (i + 2 > buf.length) c = -1 | |
if (i + 1 > buf.length) b = -1 | |
ret += | |
toChar(a) + | |
toChar(b) + | |
toChar(c) + | |
toChar(d) + | |
toChar(e) + | |
toChar(f) + | |
toChar(g) + | |
toChar(h) | |
} | |
return ret | |
} | |
function fromБаза76(str) { | |
const ret = [] | |
const block = [] | |
for (let i = 0; i < str.length; i++) { | |
let char = | |
str[i] === '+' | |
? B76_ALPHABET.indexOf(str[++i]) + 76 | |
: B76_ALPHABET.indexOf(str[i]) | |
if (char === -1) { | |
if (str[i] === '=') { | |
// padding | |
} else { | |
throw new Error('неправильная БАЗА76 строка!!!') | |
} | |
} | |
if (char !== -1) block.push(char) | |
if (block.length === 8 || str[i] === '=') { | |
ret.push((block[0] << 1) | ((block[1] ?? 0) >> 6)) | |
if (block.length > 2) | |
ret.push(((block[1] & 0b111111) << 2) | ((block[2] ?? 0) >> 5)) | |
if (block.length > 3) | |
ret.push(((block[2] & 0b11111) << 3) | ((block[3] ?? 0) >> 4)) | |
if (block.length > 4) | |
ret.push(((block[3] & 0b1111) << 4) | ((block[4] ?? 0) >> 3)) | |
if (block.length > 5) | |
ret.push(((block[4] & 0b111) << 5) | ((block[5] ?? 0) >> 2)) | |
if (block.length > 6) | |
ret.push(((block[5] & 0b11) << 6) | ((block[6] ?? 0) >> 1)) | |
if (block.length > 7) | |
ret.push(((block[6] & 0b1) << 7) | (block[7] ?? 0)) | |
block.length = 0 | |
} | |
if (str[i] === '=') break | |
} | |
return Buffer.from(ret) | |
} | |
console.log(toНёх(Buffer.from('Пенис'))) | |
console.log(fromНёх('г09ег0б5г0бгг0б8г181').toString()) | |
console.log(toБаза76(Buffer.from('Пенис'))) | |
console.log(fromБаза76('+Ыё+мКм0+н+Д+ПтоП====').toString()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment