// require lst Encoder = {} Encoder.CELL_LEN = 14 char_set = [] char_set.push(range(48, 57)) // numbers char_set.push(range(65, 90)) // capital_letters char_set.push(range(97, 122)) // letters char_set.push(range(128, 193)) // extended char_set = char_set.flat // <- 7 bit char set Encoder.CHAR_SET = char_set // UTILS ------------------------------------------------------ Encoder.Utils = {} Encoder.Utils.to_bin = function(n) if n == 0 then return "0" if n == 1 then return "1" return self.to_bin(floor(n / 2)) + str(n % 2) end function Encoder.Utils.to_int = function(n) n = n.values n.reverse r = 0 for i in n.indexes if n[i] == "1" then r = r + 2 ^ i end if end for return r end function Encoder.Utils.divide = function(s, n) if s.len == 0 then return [] end if if s.len < n then //prepend = "0" * (n - s.len) //s = prepend + s return [s] end if return self.divide(s[n:], n).insert(0, s[0:n]) end function // ------------------------------------------------------------- Encoder.encode = function(lzw) l = lzw[0:] CELL_SIZE = 0 for i in l.indexes if l[i] isa string then l[i] = l[i].code l[i] = self.Utils.to_bin(l[i]) if l[i].len > CELL_SIZE then CELL_SIZE = l[i].len end for for i in l.indexes l[i] = "0" * (CELL_SIZE - l[i].len) + l[i] end for l = l.join("") FAT_ADDED = l.len % 7 if FAT_ADDED > 0 then FAT_ADDED = 7 - FAT_ADDED l = l + "0" * FAT_ADDED fat_bin = self.Utils.to_bin(FAT_ADDED) l = "0" * (7 - fat_bin.len) + fat_bin + l cell_bin = self.Utils.to_bin(CELL_SIZE) l = "0" * (7 - cell_bin.len) + cell_bin + l l = self.Utils.divide(l, 7) //for i in l.indexes //l[i] = self.CHAR_SET[self.Utils.to_int(l[i])] //end for //print l for i in l.indexes l[i] = char(self.CHAR_SET[self.Utils.to_int(l[i])]) end for return l.join("") end function Encoder.decode = function(string) l = string.values for i in l.indexes l[i] = self.Utils.to_bin(self.CHAR_SET.indexOf(l[i].code)) l[i] = "0" * (7 - l[i].len) + l[i] end for //l[-1] = l[-1][2:] l = l.join("") CELL_SIZE = self.Utils.to_int(l[0:7]) FAT_ADDED = self.Utils.to_int(l[7: 14]) l = self.Utils.divide(l[14:], 7) //print l if FAT_ADDED > 0 then l[-1] = l[-1][0:FAT_ADDED * -1] //print l l = self.Utils.divide(l.join(""), CELL_SIZE) for i in l.indexes l[i] = self.Utils.to_int(l[i]) if l[i] < 256 then l[i] = char(l[i]) end for return l end function