Files
encoder.src
- // 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
-
- l = self.Utils.divide(l, 7)
-
- fat_bin = self.Utils.to_bin(FAT_ADDED)
l.insert(0, "0" * (6 - fat_bin.len) + fat_bin)
- l.insert(0, "0" * (7 - fat_bin.len) + fat_bin)
-
- cell_bin = self.Utils.to_bin(CELL_SIZE)
l.insert(0, "0" * (6 - cell_bin.len) + cell_bin)
- l.insert(0, "0" * (7 - cell_bin.len) + cell_bin)
-
- l = self.Utils.divide(l.join(""), 7)
-
- //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[-1] = l[-1][2:]
- l = l.join("")
-
CELL_SIZE = self.Utils.to_int(l[0:6])
FAT_ADDED = self.Utils.to_int(l[6: 12])
- CELL_SIZE = self.Utils.to_int(l[0:7])
- FAT_ADDED = self.Utils.to_int(l[7: 14])
-
l = self.Utils.divide(l[12:], 7)
l[-1] = l[-1][0:FAT_ADDED * -1]
- 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
test.src
- import_code("/home/me/projects/lzw/libs/lst.src")
- import_code("/home/me/projects/lzw/lzw.src")
- import_code("/home/me/projects/lzw/encoder.src")
- input = user_input("in: ")
- compressed = Lzw.compress(input)
- //compressed = Lzw.compress("TOBEORNOTTOBEORTOBEORNOT")
print "compressed: " + compressed
- //compressed = Lzw.compress("ffffffffffffffffffffffff")
- //print "compressed: " + compressed
- e = Encoder.encode(compressed)
- print "encoded: " + e
- dd = Lzw.decompress(Encoder.decode(e))
print "decoded and decompressed: " + dd
- //print "decoded and decompressed: " + dd
- if input != dd then exit("<color=red>ERROR</color>")
- print "input len: " + input.len
- print "encoded len: " + e.len
print input
print dd
print input == dd
- print "text reduced by: " + round(100 - (e.len / input.len * 100), 2) + "%"
- //print input
- //print dd
- //print input == dd