1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| import os, sys, math, bit
from math import log
global x
global s
global out
def isInDico(p) :
if len(p) == 1 :
return True
for i in dico :
if i == p :
return True
return False
def getCodeDico(p) :
j = 1
for i in dico :
if i == p :
return j
j = j+1
def lire() :
return inFile.read(1)
def produire(p) :
print 'produire'
print 'p ->'
print p
print 'nbBitWord ->'
print nbBitWord
if len(p) == 1 :
# binOnKBit(ord(p),nbBitWord, out)
print 'ord(p) ->'
print ord(p)
writeOct (ord(p),nbBitWord,out)
outFile.write(str(ord(p)))
else :
# binOnKBit(getCodeDico(p) + 255, nbBitWord, out)
writeOct (getCodeDico(p) + 255, nbBitWord, out)
outFile.write(str(getCodeDico(p) + 255))
outFile.write(';')
def step(x,s,dicoSize) :
x = lire()
while x != '' :
if isInDico(s+x) :
s += x
else :
if len(dico) < dicoSize :
dico.append (s+x)
produire(s)
s=x
x = lire()
produire(s)
def log2(n) :
return math.log(n) / math.log(2)
def int2bin(n):
res = ''
while n != 0: n, res = n >> 1, `n & 1` + res
return res
def binOnKBit(b, k, out) :
bin = int2bin (b)
res = initKbit (k)
print "bin = "
printBit (res,k)
for i in range (0,len(bin)) :
res = setBit (res, i, int(bin[i]))
print 'i + bin[i]'
print i
print bin[i]
def writeOct (b,k,out) :
o = int (k/8)
if k%8 != 0 :
o = o + 1
for i in range (0,o) :
#out = out + chr (getOctet (x,i))
print chr (getOctet (x,i))
#print out
print "Compression LZW"
if len(sys.argv) <= 1 :
print 'Vous devez passer en argument un nom de fichier a compresser !'
else :
if os.path.exists(sys.argv[1]) :
if len(sys.argv) >= 3 :
dicoSize = float(sys.argv[2])
nbBitWord = int(log2(dicoSize))
print 'Log = '
print nbBitWord
inFile = open(sys.argv[1],'r')
outFile = open(sys.argv[1]+'.lzw','w')
dico = []
x = ''
s = ''
out = ''
step(x,s,dicoSize)
inFile.close()
outFile.close()
else :
print 'Vous devez passez en deuxieme argument la taille limite du dictionnaire'
else :
print 'Vous devez passez en argument un nom de fichier valide !' |
Partager