Gestion d entree sortie - Ada - Programmation
Marsh Posté le 03-04-2003 à 20:28:42
si je me souviens bien il s'agit d'associer un code a chaque lettre et chiffre en associant aux lettres les plus utilisées un petit code. Comme ca, le resultat est compressé.
exemple : le "e" sera codé par 0
le "a" par 1
le "r" par 01 en supposant que les a et les e sont les lettres les plus souvent rencontrées, suivit du r
mais une petite recherche sur google me semble appropriée
Marsh Posté le 03-04-2003 à 20:31:28
polo021 a écrit : si je me souviens bien il s'agit d'associer un code a chaque lettre et chiffre en associant aux lettres les plus utilisées un petit code. Comme ca, le resultat est compressé. |
EDIT : http://tcharles.developpez.com/Huffman/ sacré google
Marsh Posté le 04-04-2003 à 17:00:00
l asm est a rendre une semaine apres le tp d ada...
un beau TP sur les listes...
alors priorite a Ada
meme si je prefere l asm :'(
le prof d algo nous a a moitie mache le travail pour Huffman...
le probleme c est qu on met plus de temps a lire et comprendre ses progs qu a les completer
Marsh Posté le 05-04-2003 à 00:02:45
J'ai regardé ça, et ça a l'air marrant.
Je voudrais donc écrire un petit prog qui se base sur cet algo. (c'est bien mieu que le RLE )
Mais j'ai deux (très ) légers problèmes...
1) Comment écrire dans un array de bytes bit par bit ?
2) Comment, à partir d'un array de bytes, contenant le fichier compressé, relire bit par bit pour parcourir mon arbre ?
PS: j'utilise du C#, mais bon, un "algo" devrait me suffir
Marsh Posté le 05-04-2003 à 01:52:48
Bon, je me suis peut-être mal exprimé...
Mon problème :
En suivant l'algo Huffman, je me retrouve avec des séries de bits, de nombre indéfinis à écrire à la suite des autres.
Par exemple :
1110 = 'a'
01 = 's'
111101011 = 'c'
=> Pour écrire "sac" dans le fichier, je dois donc écrire les bits sous cette forme :
011110111101011.
(le '.' signifie que c'est un bit vide, je me fout de sa valeur, j'en ai pas besoin)
Bon, alors comment gérer ça ?
Actuellement, j'ai par exemple : (nombres binaires convertis en bytes)
tab[0] = 14
tab[1] = 1
tab[2] = 491
Comment faire pour les concaténer ?
Deplus, le stockage en byte me pose problème, puisque si mes séries de bits commencent par des 0, alors ils ne sont pas reconnaissables, puisque par défaut tous les bits d'un byte sont à 0, hors la présence de ces 0 est vitale, sinon je suis incapable de relire le fichier.
Pour relire bit par bit le fichier, c'est bon, je vois comment faire.
Mais là, pour écrire dedans, j'ai du mal... Je vois vraiment pas du tout comment faire
J'ai bien une vague idée, mais c u truc de fou, je sens que je vais passer 20 nuits blanches dessus avant de réussir à le mettre en place... Il doit bien y avoir une méthode "simple" (genre la bidouille à deux balles du bon bidouilleur...)
Marsh Posté le 05-04-2003 à 02:22:36
Je vais vous donner le truc de porc quand j'avais fait ça en DEUG .
J'avais un char tabOctet[8], dans lequel je notais les octets "incomplets" (si vous suivez pas dites le).
Ensuite dès que ce tableau tabOctet est plein --> transformation dans un vrai octet compact (cad dans un char)
C'est clairement pas le plus rapide, mais c'est ultra facile à implémenter comme ça
Marsh Posté le 05-04-2003 à 03:07:46
Je pensais faire un truc genre : (c'est pas mieu )
Code :
|
Ou un truc du genre.
Mais là, c la grillade de cervelle de MagicBuzz assurée le temps de débuger cet algo
Pis alors le jour où il faut repasser derrière, laisse béton
Marsh Posté le 05-04-2003 à 03:21:16
Après une vingtaine d'édits, il m'a l'air pas si mal cet algo
Un peu pas rapide mais bon
Marsh Posté le 05-04-2003 à 03:44:20
MagicBuzz a écrit : Après une vingtaine d'édits, il m'a l'air pas si mal cet algo |
il est pas terrible en fait, parce ce que tu stoque indépendement le code de hufmann de chacun des caratères de ton texte initial dans le tableau tabChar, a raison d'un par case de ce tableau.
Or il arrive souvent que le codage de hufmann d'un caractère dépasse 8 bits, et là ton code foire lamentablement
Marsh Posté le 05-04-2003 à 11:58:38
Non au contraire.
Vu que je bosse en C#, j'utilise une grammaire un peu plus compréhensible que le Java, ce qui a pu te dérouter.
En C#, un octet est un "byte" et non un "char" (ce qui est 1000 fois plus logique car un char ASCII = 7 bits, et un char UNICODE = 16 bits, alors y'a mieu pour nommer le type "8 bits"...
Je reprends mon algo ligne par ligne. Son seul défaut à priori, c'est sa relative lenteur, car pour chaque bit je suis obligé de faire pas mal de calculs.
Le code :
Code :
|
PS: j'ai apporté quelques modifications au code, il y avait quelques grosses coquilles
Marsh Posté le 05-04-2003 à 15:24:37
MagicBuzz a écrit : |
Ouais admettons, mais tu limites quand même la longueur d'un code de hufmann à la taille en bits de ton char C#. C'est mal : dans un texte ou de nombreux caractères peu fréquents sont présents, il se produit facilement des codes du hufmann de lg > 16.
Marsh Posté le 05-04-2003 à 16:23:30
Mais je vois pas où tu vois que je limite quoi que ce soit
Je copie les codes de huffman dans un array de bytes, au contraire, si j'ai un code sur 1024 bits ça marchera sans aucun problème mon algo.
Je crois que tu confonds remplir un byte bit par bit et remplir mon tableau... ce dernière n'a aucune limite de taille, et ne gêne en aucun cas le nombre de bits à encoder à la fois, regarde mieu l'algo, fait-le tourner, tu verras.
Même si getTabBool() retourne un array de 20 millions de lignes, ça marchera toujours.
J'utilise un tableau de bytes au lieu d'un tableau d'autrechose (Int64 ?) simplement parceque c'est sous ce format que je peux l'enregistrer sur le disque, puisque les fonctions d'accès aux fichier prennent en paramètre un tableau de bytes. Après, que les bits soient à cheva sur plusieurs lignes, je m'en fout.
Marsh Posté le 07-04-2003 à 09:13:08
Theorie du chaos a écrit : Hey c est la cat Ada |
édite ton premier msg pour changer la cat
Marsh Posté le 07-04-2003 à 09:19:58
drasche a écrit : |
nan c est mon topic :'(
et c est un TP Ada que je fais
Marsh Posté le 07-04-2003 à 09:37:00
Theorie du chaos a écrit : nan c est mon topic :'( |
oops j'avais loupé la mention "C#"
Marsh Posté le 07-04-2003 à 09:49:54
bah ça change rien à l'algo, et d'après mes souvenirs, convertir e code que j'ai mis en ADA y'en a pas pour 2 heures. même en QBASIC je sais le traduire, ainsi qu'en JavaScript alors l'ADA qui est quand même un peu plus puissant devrait s'en sortir quand même
Marsh Posté le 07-04-2003 à 13:39:22
de toute facon je dois completer un prog de mon prof deja existant...
je comptais pas copier
Marsh Posté le 12-04-2003 à 12:31:26
Theorie du chaos a écrit : |
i was here ..... c'etait un de mes projets en C l'année dernière .....pointeurs de pointeurs ... ca fait reflechir .. et ca rend fou aussi ......
compression ok --> décompression un peu plus dur .. pas eu le temps de finir ....
Marsh Posté le 12-04-2003 à 12:33:24
moi c le contraire
la compression est montrueuse et la decompression c tout court...
mais moi c de l Ada
Marsh Posté le 12-04-2003 à 12:36:35
Theorie du chaos a écrit : moi c le contraire |
ben si tu veux .. tu rends la compression en C et la decomp en ADA
Marsh Posté le 14-04-2003 à 19:00:20
il va etre content le prof
bon... ca compile...
si ca pouvait compresser aussi...
faut que je trouver la syntaxe...
Marsh Posté le 14-04-2003 à 19:15:10
a la base il faut que je lance
Compresser
j aimerais savoir comment faire pour l appeler sur un fichier donne...
j aurais bien utilise un Get
et declare le nom du fichier en string
mais le compilateur gueule parce que la longueur de String n est pas contrainte
en plus je ne connais pas le nom exact de la librairie qui fait un Get(String)... si elle existe...
Marsh Posté le 14-04-2003 à 21:08:24
Theorie du chaos a écrit : a la base il faut que je lance |
regarde du coté des "unbounded strings"
Marsh Posté le 03-04-2003 à 19:57:01
c mal
Message édité par theorie du chaos le 14-04-2003 à 21:02:31