Page 1 sur 1

uudecode

Publié : dim. 16/juil./2006 21:37
par Backup
quelqu'un a t'il deja fait une procedure pour decoder un UUencode ?

j'en ai trouvé une dans le purearea mais ces procedures ne marche pas

jai tenté de faire decoder un fichier "uucode.txt" qui contien une tres belle image par ces procedures, mais elle ne decode pas comme il faut avec un editeur Hexa on se rends compte que ces procedures laisse des "@"
un peut partout

si ça tente quelqu'un pour essayer de comprendre pourquoi ça marche pas

voici mon code qui recupere le fichier "uucode.txt" et le transforme en
"uucode.jpg" (enfin en principe)

Code : Tout sélectionner

; English forum: http://purebasic.myforums.net/viewtopic.php?t=8989&highlight=
; Author: Wayne Diamond
; Date: 03. January 2004

Procedure.s UUDecode(sInBuf.s)
  sOutBuf.s = ""
  For lLoop.l = 1 To Len(sInBuf) Step 4
    sOutBuf = sOutBuf + Chr((Asc(Mid(sInBuf, lLoop, 1)) - 32) * 4 + (Asc(Mid(sInBuf, lLoop + 1, 1)) - 32) / 16)
    sOutBuf = sOutBuf + Chr((Asc(Mid(sInBuf, lLoop + 1, 1)) % 16) * 16 + (Asc(Mid(sInBuf, lLoop + 2, 1)) - 32) / 4)
    sOutBuf = sOutBuf + Chr((Asc(Mid(sInBuf, lLoop + 2, 1)) % 4) * 64 + Asc(Mid(sInBuf, lLoop + 3, 1)) - 32)
  Next lLoop
  ProcedureReturn sOutBuf
EndProcedure

Procedure.s UUEncode(sInBuf.s)
  sOutBuf.s = ""
  For lLoop.l = 1 To Len(sInBuf) Step 3
    sOutBuf = sOutBuf + Chr(Asc(Mid(sInBuf, lLoop, 1)) / 4 + 32)
    sOutBuf = sOutBuf + Chr((Asc(Mid(sInBuf, lLoop, 1)) % 4) * 16 + Asc(Mid(sInBuf, lLoop + 1, 1)) / 16 + 32)
    sOutBuf = sOutBuf + Chr((Asc(Mid(sInBuf, lLoop + 1, 1)) % 16) * 4 + Asc(Mid(sInBuf, lLoop + 2, 1)) / 64 + 32)
    sOutBuf = sOutBuf + Chr(Asc(Mid(sInBuf, lLoop + 2, 1)) % 64 + 32)
  Next lLoop
  ProcedureReturn sOutBuf
EndProcedure


ok=0

CallDebugger
OpenFile(1,"uucode.txt")
While  Eof(1)=0  
  phrase$=ReadString(1)
  
  If  Left(phrase$,3)="end"
    ok=0
  EndIf
  
  If ok=1 ; on recupere le binaire
    phrase$=(Right(phrase$,Len(phrase$)-1)) ; on retire le premier caractere    
     phrase$=UUDecode(phrase$)
    resul$= resul$+phrase$
  EndIf
  
  
 
  If Left(phrase$,9)="begin 644" 
    ok=1
  EndIf
  
 
  
  
Wend
CloseFile(1)

OpenFile(1,"uucode.jpg")
WriteString(1,resul$)
CloseFile(1)
ok=0
et le fameux fichier "uucod.txt" qui contient une tres jolie image
qui sera la recompense de celui qui aura trouvé ou ça merdoie :lol:

http://michel.dobro.free.fr/bidouilles/uucode.txt

Publié : dim. 16/juil./2006 21:49
par wolfjeremy
Salut,

Je vais pas me lancer la dedans car je travail déjà sur l'encodage et decodage d'image, mais c'était juste pour savoir c'est quoi qui a dans l'image ? ( :lol: )

Publié : dim. 16/juil./2006 22:33
par Backup
voici le comparatif entre les deux fichier

celui de droite est le bon
celui de gauche est celui que j'obtien avec cette procedure

Image

Publié : dim. 16/juil./2006 23:42
par Backup
voici le principe de l'uuencode
Principe de l'encodage Uuencode

L'encodage Uuencode consiste à prendre des groupes de 3 octets (24 bits) et à les considérer comme 4 groupes de 6 bits, représentés par des valeurs comprises entre 0 et 63. S'il y a moins de 24 bits dans le flux entrant, Uuencode complète avec des 0.

Uuencode ajoute 32 (valeur décimale) à chaque valeur, afin d'obtenir une valeur correspondant à un caractère ASCII imprimable.

Les données sont représentées sur des lignes de 60 caractères. Ainsi chaque ligne permet d'encoder 45 octets du flux d'entrée car 4 octets des données de sortie représentent 3 octets de données d'entrée.

Chaque ligne est précédée d'un caractère indiquant le nombre de caractères de la ligne.

Enfin, une ligne contenant uniquement un espace, suivie d'une ligne contenant la chaîne de caractères end. L'espace précédant la ligne finale est parfois remplacé par le caractère ASCII 96 (accent grave), car certain logiciels de messagerie suppriment les lignes vides.
pas evident a saisir du premier coup en fait , mais je persevere :D
il me semble toutefois qu'il y a une erreur la dedans
d'apres ce qu'il dise, chaque caractere ne pourrai avoir une valeur depassant 95 !!

or on pourrai aller jusqu'a 127 en theorie
c'est a dire ajouter 64 et non pas 32

ou alors faire des paquets de 7 bits et pas 6 comme ils le disent
mais en partant de 4 octets et pas trois comme ils le disent


bref, plus je cherche moins je comprends :lol:

Publié : lun. 17/juil./2006 0:50
par Backup
wolfjeremy a écrit :Salut,

Je vais pas me lancer la dedans car je travail déjà sur l'encodage et decodage d'image, mais c'était juste pour savoir c'est quoi qui a dans l'image ? ( :lol: )
la voici mais que cela ne vous empeche pas de chercher hein ? :lol:

attention si t'y touche , t'es mort !! :?

Image

Publié : lun. 17/juil./2006 2:26
par Gillou
Juste une question tu as trouvé le code pour retrouver l'image de base ou c l'image que tu as converti?

A mon avis le code que tu proposes ne marche pas pour une raison simple tu travailles avec des chaînes donc si le fichier contient des caractères nuls ils sont supprimés automatiquement lors de la conversion. De plus lors de la conversion si le fichier a une longueur non multiple de 3 et bien que se passe t'il? il recopie le code ou il le transforme en faisant une erreur???

Je te poste le code d'encode et décodage demain soir ;)

Bonne nuit

Gillou

PS : Pour le 95 je suis d'accord : on fonctionne avec 3 caractères donc 255*255*255 et à la place on en met 4 pour un meme nombre max (255*255*255) ça nous fait donc round(pow(255*255*255, 1/4),0) = 63 sans oublier l'ajout de 32 par caractère ce qui donne 32+63=95

Après tout dépend si tu veux ou pas respecter la règle que tu as précisé :D

Publié : lun. 17/juil./2006 11:12
par nico
Dobro a écrit :voici le principe de l'uuencode
Principe de l'encodage Uuencode

L'encodage Uuencode consiste à prendre des groupes de 3 octets (24 bits) et à les considérer comme 4 groupes de 6 bits, représentés par des valeurs comprises entre 0 et 63. S'il y a moins de 24 bits dans le flux entrant, Uuencode complète avec des 0.

Ce que tu décris c'est la base 64, les commandes de Pure devrait fonctionner pour ça, non?

Publié : lun. 17/juil./2006 11:58
par Gillou
Oui, les commandes peuvent fonctionner avec pure si on ajoute 64 et pas 32 aux 4 groupes de 6 bits

Publié : lun. 17/juil./2006 12:22
par Dr. Dri
Gillou a écrit :Oui, les commandes peuvent fonctionner avec pure si on ajoute 64 et pas 32 aux 4 groupes de 6 bits
donc c'est une espèce de base32, ca pourrait être sympa à coder ^^

Dri

Publié : lun. 17/juil./2006 16:48
par nico
Gillou a écrit :Oui, les commandes peuvent fonctionner avec pure si on ajoute 64 et pas 32 aux 4 groupes de 6 bits
J'ai rien compris, qu'est ce que tu veux dire par ajouter?

Publié : lun. 17/juil./2006 21:30
par Backup
Gillou a écrit :Juste une question tu as trouvé le code pour retrouver l'image de base ou c l'image que tu as converti?
non c'est l'image converti a l'aide de "Xnews" un reader de news
A mon avis le code que tu proposes ne marche pas pour une raison simple tu travailles avec des chaînes
ce code est tiré d'un listing pique sur Pure Area (UUencode / UUdecode)
il est de
; English forum:
; Author: Wayne Diamond
; Date: 03. January 2004
mais en fait je pense que Wayne Diamond a pompé le code d'apres un source C#
que j'ai retrouvé ici , et qui reutilise la meme technique !!
et quasi les meme variable ! :lol:
http://www.eggheadcafe.com/PrintSearchC ... LINKID=351

ce qui demontrerai au passage qu'il est peut etre pas si difficile de transformer du code c# en purebasic :D

nico a écrit :
Gillou a écrit :Oui, les commandes peuvent fonctionner avec pure si on ajoute 64 et pas 32 aux 4 groupes de 6 bits
J'ai rien compris, qu'est ce que tu veux dire par ajouter?
ce qu'il veux dire c'est que le UUencode n'est pas du Base64

en uuencode on ajoute la valeur 32 !! (pas 64) :D

Publié : lun. 17/juil./2006 22:15
par Lna
Dobro ce que Gillou veut te dire, c'est qu'une image jpg contient des $00 et qui pour les chaines de caractères sont interprétés comme délimiteur en Purebasic.
Pour un traitement binaire fiable, il faudra passer par des allocatememory avec un compteur de caractères.
Pour disposer d'un traitement simplifié, il faut placer les 3 octets dans le contenu d'une variable .L, en faire une copie et masquer par un & avec %111111 + 32 pour extraire 1 octet, puis faire des décalages de >> 6 pour passer au suivant des 4 octets.
Ensuite, il suffira de réaliser l'opération inverse pour décoder.

A peluche les nounours #nounours #nounours #nounours

Publié : lun. 17/juil./2006 23:00
par Backup
Lna a écrit :Dobro ce que Gillou veut te dire, c'est qu'une image jpg contient des $00 et qui pour les chaines de caractères sont interprétés comme délimiteur en Purebasic.
oui! oui ! j'avais bien compris :D

Publié : sam. 22/juil./2006 23:01
par Lna
Voila ça fonctionne pour ton crapaud. 8)

Code : Tout sélectionner

; v 3.94

; English forum: http://purebasic.myforums.net/viewtopic.php?t=8989&highlight= 
; Author: Wayne Diamond 
; Date: 03. January 2004 

STRUCTURE adresse_uu
  P.B[4]
ENDSTRUCTURE

GLOBAL buf$

Procedure.l UUDecode_2() 
  PROTECTED a1.l,a2.l,a3.l,a4.l,format.l,lLoop.l

  format=LEN(buf$)
  ; buf$+"   "            ; SOUPAPE DE SECURITE POUR L'AVENIR : PRENDRA LA VALEUR $00 UNE FOIS 32 - 32

  *p_read.adresse_uu=@buf$
  *p_read_num.adresse_uu=@a1
  *p_write.adresse_uu=@buf$
  
  FOR lLoop=1 TO format STEP 4
  
    a1.l=(*p_read\p[0]-32) & %111111
    a2.l=(*p_read\p[1]-32) & %111111 
    a3.l=(*p_read\p[2]-32) & %111111
    a4.l=(*p_read\p[3]-32) & %111111
    
    a1<<18
    a2<<12
    a3<<6
    
    a1|a2|a3|a4
    
    *p_write\p[0]=*p_read_num\p[2]
    *p_write\p[1]=*p_read_num\p[1]
    *p_write\p[2]=*p_read_num\p[0]
    
    *p_read+4
    *p_write+3
    
  NEXT lLoop
  
  ProcedureReturn format / 4 * 3
EndProcedure 

Procedure.s UUEncode(sInBuf.s) 
  sOutBuf.s = "" 
  For lLoop.l = 1 To Len(sInBuf) Step 3 
    sOutBuf = sOutBuf + Chr(Asc(Mid(sInBuf, lLoop, 1)) / 4 + 32) 
    sOutBuf = sOutBuf + Chr((Asc(Mid(sInBuf, lLoop, 1)) % 4) * 16 + Asc(Mid(sInBuf, lLoop + 1, 1)) / 16 + 32) 
    sOutBuf = sOutBuf + Chr((Asc(Mid(sInBuf, lLoop + 1, 1)) % 16) * 4 + Asc(Mid(sInBuf, lLoop + 2, 1)) / 64 + 32) 
    sOutBuf = sOutBuf + Chr(Asc(Mid(sInBuf, lLoop + 2, 1)) % 64 + 32) 
  Next lLoop 
  ProcedureReturn sOutBuf 
EndProcedure 

ok=0 

;CallDebugger 
OpenFile(1,"uucode.txt")
OpenFile(2,"uucode.jpg")

While  Eof(1)=0  
  USEFILE(1)
  phrase$=ReadString() 
  
  If  Left(phrase$,3)="end" 
    ok=0 
  EndIf
  
  If ok=1 ; on recupere le binaire 
    
    buf$=(Right(phrase$,Len(phrase$)-1)) ; on retire le premier caractere
    long_binaire=UUDecode_2() 
    
    USEFILE(2)
    WRITEDATA(@buf$,long_binaire)
    
  EndIf 
  
  If Left(phrase$,9)="begin 644" 
    ok=1 
  EndIf 

Wend 

CloseFile(1) 
CloseFile(2) 

ok=0 
Il y a une multitude de solutions. 8O
Il n'est pas possible d'optimiser sans prendre en compte la totalité du programme, et de connaitre tous les cas de figures possibles.

Je n'ai pas commenté, car on est sur un forum de bêtes en programmation ici. 8)

J'utilise la variable GLOBAL buf$ en double emploi pour contenir la chaine de caractères à convertir et pour contenir le binaire de l'image.

Si quelqu'un peut confirmer que la gestion des variables de chaînes en Purebasic est possible sans laisser du garbage en mémoire à la suite des $00 :roll: , merci. (Sinon utilise un allocatememory pour le binaire, ou alors tu fais une boucle pour remplacer les $00 possibles)

Je te laisse Dobro, c'est l'heure où Léguman se retransforme en citrouille, c'est le moment où il est encore plus fort. 8)

A peluche les nounours #nounours #nounours #nounours

Publié : dim. 23/juil./2006 5:55
par Backup
Merci pour ce code , je m'en vais regarder ça :D