Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- функция более требовательная к памяти, но менее к месту на диске
- если убрать лишнее, то 205 байт против 252
- local function df(s, x, n, c, u)
- local f, r, a, b = "", ""
- for i = 1, #s do
- a, b = "", s:sub(i, i):byte()
- for o = 0, x do
- a = bit32.extract(b, o)..a
- end
- f = f..a
- if #f == n then
- for j = 1, #f, c do
- r = r..string.char(tonumber(f:sub(j, j+u), 2))
- end
- f = ""
- end
- end
- return r
- end
- ]]
- --local str = "007qEUayuZKoyazpd0I53MuM5669ijgRTRAovkcgAWAhtgaa61bqIWjzAQWwrNSH79sboFJ7Y1xx4Dh3bjHcqyFIaYkeJLSq2qoORQ6TyILw00"
- local d, o, k, l, tl, tlm = {}
- local function df(s, x, n, c, u) -- преобразование в стандартную 7b таблицу и обратно
- local f, r, i, a, b = "", "", 1
- while i <= #s do
- if i == 1 then
- a = ""
- if n ~= 56 then -- получить код символа или индекс в словаре
- b = string.byte(d[s:sub(i, i)])
- else
- b = s:sub(i, i):byte()
- end
- for o = 0, x do
- a = bit32.extract(b, o)..a -- преобразовать в двоичный вид с границей "x"
- end
- f = f..a -- добавить к битовому потоку
- if #f == n then -- если поток заполнен до значения "n"
- for j = 1, #f, c do -- пройти по байтам, указанного размера
- r = r..string.char(tonumber(f:sub(j, j+u), 2))
- -- добавить готовый символ в выходную строку
- end
- f = ""
- end
- s = s:sub(2, #s)
- i = i - 1
- end
- i = i + 1
- end
- return r
- end
- local function encode() -- адаптивное кодирование
- -- возвращает размер словаря + количество добавочных символов + закодированный текст
- for i = 1, #str do -- составление таблицы символов
- o = str:sub(i, i)
- if not d[o] then -- добавление нового символа в таблицу
- d[o] = true
- table.insert(d, o)
- if o:byte() > 126 then -- если сивол вне стандартной 7b таблицы
- k = true -- пометить
- end
- end
- if #d > 127 then print("ERROR: dictonary overflow") return end
- -- если словарь переполнен - прервать программу
- end
- if not k then -- если входная строка может быть преобразованна в 7b
- l = 56-math.fmod(#str, 56) -- рассчет количества недостающих символов
- if l ~= 0 and l ~= 56 then
- for i = 1, l do
- str = str.." " -- добавление недостающих символов
- end
- end
- return string.char(0, l)..df(str, 6, 56, 8, 7)
- -- преобразование кодировки, добавление числа добавочных символов
- else -- кодирование с новой таблицей
- if #d < 17 then -- 5b кодировка
- tlm, tl = 40, 4 -- битность*8, битность-1
- elseif #d < 33 then -- 6b
- tlm, tl = 48, 5
- elseif #d < 65 then -- 7b
- tlm, tl = 56, 6
- end
- l = tlm-math.fmod(#str, tlm)
- if l ~= 0 and l ~= tlm then
- for i = 1, l do
- str = str.." "
- end
- end
- return string.char(#d, l)..df(str, tl, tlm, 8, tl+2)
- end
- end
- local function decode()
- tl, tlm = str:sub(1, 1):byte(), str:sub(2, 2):byte()
- if tl == 0 then -- декодирование в 8 бит из стандартной 7b
- res = df(str, 7, 56, 7, 6)
- else
- for i = 1, tl do -- восстановление словаря
- table.insert(d, str:sub(i, i))
- end
- if #d < 17 then
- l = 40
- elseif #d < 33 then
- l = 48
- elseif #d < 65 then
- l = 56
- end
- str = str:sub(tl+1)
- res = df(str, 7, l, 7, 6)
- end
- return res:sub(-tlm)
- end
- print(str)
- ololo = encode()
- print(ololo)
- lolol = decode()
- print(lolol)
- print(#str, #ololo, #lolol)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement