Skip to content

Instantly share code, notes, and snippets.

@teidesu
Created October 17, 2022 15:25
Show Gist options
  • Save teidesu/05e861d3309356a2b71d17f22a087108 to your computer and use it in GitHub Desktop.
Save teidesu/05e861d3309356a2b71d17f22a087108 to your computer and use it in GitHub Desktop.
hex и base64? нет, блин, НЁХ и БАЗА76
// не бейте за кринж код, писала на коленке по фану
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