Page 1 sur 4

Conversion hexa/texte en binaire

Publié : lun. 11/sept./2006 9:05
par andrebernard
Bonjour

J'ai trouvé sur ce forum un code génial de patrick88 qui transforme n'importe quel fichier en texte.

Code :

Code : Tout sélectionner

#src=0 
#dst=1 

source$=OpenFileRequester("Fichier à traiter","*.*","*.*",1) 
destin$=SaveFileRequester("Fichier traité","dump.txt","*.txt",1) 
If source$<>"" 
  If destin$<>"" 
    OpenFile(#src,source$) 
    CreateFile(#dst,destin$) 
    UseFile(#src) 
    Repeat 
      octet=ReadByte() 
      octet=octet&$FF 
      UseFile(#dst) 
      If octet<16 
        WriteString("0"+Hex(octet)+",") 
      Else 
        WriteString(Hex(octet)+",") 
      EndIf 
      UseFile(#src) 
    Until Loc()=Lof() 
    
    CloseFile(#dst) 
    CloseFile(#src) 
  EndIf 
EndIf 

Je voudrais savoir si quelqu'un connait comment faire le contraire.

Merci a tous
Bonne journée

Publié : lun. 11/sept./2006 12:37
par brossden
Le code qui suit est en PureBasic 4 !! Attention il y a quelques adaptations à faire pour le ramener en PureBasic 3 mais comme je ne vois pas l'interet de rester en PB3 ....

Code : Tout sélectionner

#src=0
#dst=1
Lg=0
Matrice.s="0123456789ABCDEF"
source$=OpenFileRequester("Fichier traité","dump.txt","*.*",1)
destin$=SaveFileRequester("Fichier à traiter","dump1.txt","*.*",1)
If source$>""
  If destin$>""
    OpenFile(#src,source$)
    CreateFile(#dst,destin$)
    Lg = Lof(#src)
    If Lg>0
      *Source=AllocateMemory(Lg)
      *Destin=AllocateMemory(Lg/3)
      ReadData(#src,*Source,Lg)
      For n=0 To Lg Step 3
        PokeC(*Destin+n/3, ((FindString(Matrice,PeekS(*Source+n,1),1)-1)*16)+(FindString(Matrice,PeekS(*Source+n+1,1),1)-1))
      Next
      WriteData(#dst,*Destin,Lg/3)    
    EndIf
  EndIf
EndIf
CloseFile(#src)
CloseFile(#dst)
Dans la même optique et en evitant de faire une multitude d'accès au disque dur le programe initial revu :

Code : Tout sélectionner

#src=0
#dst=1
Lg=0
source$=OpenFileRequester("Fichier traité","*.*","*.*",1)
destin$=SaveFileRequester("Fichier à traiter","dump.txt","*.*",1)
If source$>""
  If destin$>""
    OpenFile(#src,source$)
    CreateFile(#dst,destin$)
    Lg = Lof(#src)
    If Lg>0
      *Source=AllocateMemory(Lg)
      ReadData(#src,*Source,Lg)
      For n=0 To Lg
        Destin.s + Hex(PeekC(*Source+n))+","
      Next
      WriteString(#dst,Destin)    
      Debug Destin
    EndIf
  EndIf
EndIf
CloseFile(#src)
CloseFile(#dst)

Retour en arriere

Publié : mar. 12/sept./2006 12:28
par andrebernard
Bonjour

Je te remercie denis de ta reponse rapide à mon probleme qui m'empechait de continuer mon application.

Le 1er code c'est de la balle, il marche super bien.
Par contre pour le deuxieme, je ne suis pas arrivé à le faire marcher.
Il traine et ne renvois pas un bon resultat.

Quoi qu'il en soit je te remercie de ta peine.
Et je garde le premier qui me conviens parfaitemement.

Parrallelement à toi, patrick88 m'a répondu en m'envoyant un convertisseur complet bin/hexa et hexa/bin.

J'en fait profiter tout le monde, je pense que ce doit etre son souhait.

Je vous remercie donc tous pour votre gentillesse et votre compétence.
Grace à vous je ne me sent pas seul devant la complexité de ce language.
Excelente journée.

Message de Patrick88 :

à l'arrache comme ça, il y a un bug ,
le fichier résultat est plus petit de un octet ?? ? pas trouvé pourquoi

Code : Tout sélectionner


; Code créé par patrick88
; sur Pb 4.0

#src = 0 
#dst = 1 

Enumeration 
#main 
#bouton1 
#bouton2 
EndEnumeration 

Procedure.s fRepEnCours() 

 appdir$ = Space(255) 
 GetCurrentDirectory_(255, @appdir$) 

 If Right(appdir$, 1) <> "\" ; si l'adresse ne finit pas par "\" 
  appdir$ = appdir$ + "\" ; on rajoute le "\" 
 EndIf 

 ProcedureReturn appdir$ 
 
EndProcedure 

Procedure ecrit_hexa() 
 
 FichierParDefaut$ = fRepEnCours()+"*.txt" 
 Filtre$ = "Texte (*.txt)|*.txt|executable (*.exe)|*.pb|Tous les fichiers (*.*)|*.*" 
 Filtre  = 1    
 source$ = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre) 

 If source$ 
 
  path$= GetPathPart(source$) 
  ext$ = GetExtensionPart(source$) 
  name$ = GetFilePart(source$) 
  destin$ = path$ + Left(name$,Len(name$)-Len(ext$)) + "hexa" 
  OpenFile(#src,source$) 
  CreateFile(#dst,destin$) 

  Repeat 
 
   octet=ReadByte(#src) 
   octet=octet&$FF 

   If octet<16 
    WriteString(#dst,"0"+Hex(octet)+",") 
   Else 
    WriteString(#dst,Hex(octet)+",") 
   EndIf 

  Until Loc(#src)=Lof(#src) 
  
  WriteString(#dst,"1A")  
  CloseFile(#dst) 
  CloseFile(#src) 
 
 EndIf 

EndProcedure 

Procedure hexa_vers_decimal(valeur$) 

 octet1.b = 0 
 octet2.b = 0 
 valeur_entiere.b = 0 
 car1.b = Asc(Right(valeur$,1)) 
  
 Select car1 
  Case Asc("A") To Asc("F") 
   ; Debug Asc("A") = 65 , A en hexa = 10 en décimal 
   octet1 = car1-55 
  Case Asc("0") To Asc("9") 
   octet1 = Val(Chr(car1)) 
 EndSelect 
  
 car2.b = Asc(Left(valeur$,1)) 
  
 Select car2 
  Case Asc("A") To Asc("F") 
   ; Debug Asc("A") = 65 , A en hexa = 10 en décimal 
   octet2 = car2-55 
  Case Asc("0") To Asc("9") 
   octet2 = Val(Chr(car2)) 
 EndSelect 
  
 valeur_entiere = (octet2*16)+octet1 
 ProcedureReturn valeur_entiere 

EndProcedure 

Procedure convertit_hexa() 

 FichierParDefaut$ = fRepEnCours()+"*.hexa" 
 Filtre$ = "Hexa (*.hexa)|*.hexa|Texte (*.txt)|*.txt|executable (*.exe)|*.pb|Tous les fichiers (*.*)|*.*" 
 Filtre  = 0    
 source$ = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre) 
 octet.b 

 If source$ 
 
  path$= GetPathPart(source$) 
  ext$ = GetExtensionPart(source$) 
  name$ = GetFilePart(source$) 
  destin$ = path$ + Left(name$,Len(name$)-Len(ext$)) + "bin" 
  OpenFile(#src,source$) 
  CreateFile(#dst,destin$) 

  While Eof(#src)=0 
 
   chaine_octet$=ReadString(#src) 
 
   For i = 1 To CountString(chaine_octet$,",")-1 
 
    octet$ = StringField(chaine_octet$,i,",") 
    octet = hexa_vers_decimal(octet$) 
    WriteByte(#dst,octet) 
 
   Next 
    
  Wend 
    
  CloseFile(#dst) 
  CloseFile(#src) 
  
 EndIf 
 
EndProcedure 

Procedure main() 

 If OpenWindow(#main,0,0,200,100,"Dump et restauration de fichier",#PB_Window_SystemMenu|#PB_Window_ScreenCentered ) 

  If CreateGadgetList(WindowID(#main)) 
   ButtonGadget(#bouton1,0,0,WindowWidth(#main),WindowHeight(#main)/2,"Fichier Binaire vers fichier hexa(.hexa)") 
   ButtonGadget(#bouton2,0,GadgetHeight(#bouton1),WindowWidth(#main),WindowHeight(#main)/2,"Fichier Hexa(.hexa) vers Fichier Binaire") 
  EndIf 
  
  Repeat 

   event = WaitWindowEvent() 
    
   Select event 

    Case #PB_Event_Gadget 

     Select EventGadget() 

      Case #bouton1 
       ecrit_hexa() 
      Case #bouton2 
       convertit_hexa() 

     EndSelect 

   EndSelect 

  Until event=#PB_Event_CloseWindow 

 EndIf 

EndProcedure 

main() 
End

Publié : mar. 12/sept./2006 13:04
par Patrick88
correction

il faut supprimer le -1 dans la Procedure convertit_hexa() sur la ligne

Code : Tout sélectionner

For i = 1 To CountString(chaine_octet$,",")-1 
également supprimer

Code : Tout sélectionner

WriteString(#dst,"1A") 
dans la Procedure ecrit_hexa()

patrick

Correction

Publié : mar. 12/sept./2006 16:07
par andrebernard
Bonjour

Je te remercie patrick de ce correctif.

Je me permet une remarque apres plusieurs essais, le code de denis (donc le premier, puisque le 2e n'a pas fonctionné avec moi) est extremement plus rapide que celui que tu as proposé.

J'ai essayé sur une grosse image bmp de 2 mo et elle a été convertie presque instantanément par le code de denis.
Par contre, je n'ai pas pu le faire avec le tiens, cela a été tellement long que je ne sais pas si il tourne en boucle ou bien il faut attendre, vu qu'il n'y a pas de barre de progression ou de texte qui informe du travail accompli.

Pourquoi cette difference de temps ????? l'aurais-je mal utilisé ?????

Encore une fois, ce n'est pas une critique, c'est juste pour faire avancer le schmilblick, car nul comme je suis, je suis incapable de comprendre aucun des 3 codes que vous m'avez gentiment proposé.

En tout cas entre ton codeur bin/hexa et le decodeur de denis hexa/bin je vais pouvoir m'eclater ........... :D :D :D :D

Je ne cesserais de vous remercier.
Que cette journée vous apporte le bonheur que vous m'avez procuré.

Re: Correction

Publié : mar. 12/sept./2006 17:16
par Patrick88
andrebernard a écrit : Pourquoi cette difference de temps ????? l'aurais-je mal utilisé ?????
à l'origine c'était pour convertir un source C de 3ko, il n'y avait pas besoin d'une grande vitesse...

pourquoi c'est long avec mon code, parce que la lecture se fait octet par octet, donc plus le fichier est gros....
alors que l'autre programme lit le fichier en une fois dans une zone mémoire (une sorte de tableau DIM) ensuite c'est la mémoire qui est lue "octet par octet" ...

pour la barre de progression...

patrick

Rapidité

Publié : mar. 12/sept./2006 17:25
par andrebernard
Merci de ces precisions

Je vais demander à denis si il peut me concocter un code dans le genre de celui qui converti hexa/bin mais en bin/hexa, donc pour remplacer le tiens qui est une géniale idée, mais peche un peu pour les gros fichiers.

A moins que tu en ai un sous la main à mettre sur le forum sans trop vouloir te deranger. :oops:

Car le bleme c'est que j'ai des centaines de gros fichiers a convertir alors je t'explique pas la galere.

Quoi qu'il en soit je vous remercie encore tous les deux.

Publié : lun. 18/sept./2006 15:48
par brossden
Pour Andre Bernard (Corrigé et boosté)
Puisque tu aimes la vitesse : :lol: (sur ma machine je traite un fichier bin de 5 Mo en 1 sec )

Code : Tout sélectionner

Global Matrice.s="0123456789ABCDEF"
Procedure.s Hexa(dec)
  x = dec % 16
  y = dec / 16
  ProcedureReturn Mid(Matrice,y+1,1)+Mid(Matrice,x+1,1)
EndProcedure  
  

#src=0
#dst=1
Lg=0
source$=OpenFileRequester("Fichier traité","*.*","*.*",1)
destin$=SaveFileRequester("Fichier à traiter","dump.hex","*.*",1)
If source$>""
  If destin$>""
    OpenFile(#src,source$)
    CreateFile(#dst,destin$)
    Lg = Lof(#src)
    Lgd = Lg*3
    If Lg>0
      *Source=AllocateMemory(Lg)
      *Destin=AllocateMemory(Lgd)
      ReadData(#src,*Source,Lg)
      For n=0 To Lg 
        PokeS(*Destin+(n*3),Hexa(PeekC(*Source+n))+",")
      Next
      WriteData(#dst,*Destin,Lgd)   
      Debug Destin
    EndIf
  EndIf
EndIf
CloseFile(#src)
CloseFile(#dst) 
MessageRequester("Etat du programme", "Conversion finie")

Publié : lun. 18/sept./2006 16:03
par SPH
Tiens, je vais aussi essayer d'en faire un...

A propos, quel est son interet ?? celui de passer un logiciel par l'intermediaire de texte ????

Publié : lun. 18/sept./2006 16:51
par brossden
Amateurs de vitesse, de sensations fortes :lol:
Plus vite toujours plus vite ! L'ivresse de la vitesse :
(500 ms pout 5 Mo ! Qui dit mieux ?)

Code : Tout sélectionner

#src=0
#dst=1
Lg=0
source$=OpenFileRequester("Fichier traité","*.*","*.*",1)
destin$=SaveFileRequester("Fichier à traiter","dump.hex","*.*",1)
temps = GetTickCount_() 
If source$>""
  If destin$>""
    OpenFile(#src,source$)
    CreateFile(#dst,destin$)
    Lg = Lof(#src)
    Lgd = Lg*3
    If Lg>0
      *Source=AllocateMemory(Lg)
      *Destin=AllocateMemory(Lgd)
      ReadData(#src,*Source,Lg)
      For n=0 To Lg 
        m=n*3
        dec=PeekC(*Source+n)
        H=(dec/16)+48
        If H>57 : H+7 :EndIf 
        b=(dec%16)+48
        If b>57 : b+7 :EndIf  
        PokeC(*Destin+ m,H)
        PokeC(*Destin+ m+1,b)
        PokeC(*Destin+ m+2,44) 
      Next
      WriteData(#dst,*Destin,Lgd)   
    EndIf
  EndIf
EndIf
CloseFile(#src)
CloseFile(#dst) 
MessageRequester("Etat du programme", "Conversion finie " +Str( GetTickCount_()-temps )+" ms")
:lol:

Publié : lun. 18/sept./2006 17:05
par brossden
Toujours plus vite !
(200 ms pout 5 Mo ! Qui dit encore mieux ?)

Code : Tout sélectionner

#src=0
#dst=1
Lg=0
source$=OpenFileRequester("Fichier traité","*.*","*.*",1)
destin$=SaveFileRequester("Fichier à traiter","dump.hex","*.*",1)
temps = GetTickCount_() 
If source$>""
  If destin$>""
    OpenFile(#src,source$)
    CreateFile(#dst,destin$)
    Lg = Lof(#src)
    If Lg>0
      *Source=AllocateMemory(Lg)
      *Destin=AllocateMemory(Lg*3)
      ReadData(#src,*Source,Lg)
      For n=0 To Lg 
        m=n*3
        dec=PeekC(*Source+n)
        H=(dec/16)+48
        If H>57 : H+7 :EndIf 
        b=(dec%16)+48
        If b>57 : b+7 :EndIf  
        PokeW(*Destin+ m,(H*256)+b)
        PokeC(*Destin+ m+2,44) 
      Next
      WriteData(#dst,*Destin,Lgd)   
    EndIf
  EndIf
EndIf
CloseFile(#src)
CloseFile(#dst) 
MessageRequester("Etat du programme", "Conversion finie " +Str( GetTickCount_()-temps )+" ms")

Publié : mar. 19/sept./2006 2:42
par SPH
brossden a écrit :Toujours plus vite !
(200 ms pout 5 Mo ! Qui dit encore mieux ?)
Moi, je dis mieux :

Code : Tout sélectionner

temps = GetTickCount_() 
MessageRequester("Etat du programme", "Conversion finie " +Str( GetTickCount_()-temps )+" ms") 
Vala...

Ouai, en effet, quitte a créer un fichier vide, autant meme faire un Rem :wink:

Utilisation du texte

Publié : mar. 19/sept./2006 5:27
par andrebernard
Bonjour et encore merci a tous de vous pencher sur mon berceau de bb programmeur.

Pour repondre à la curiosité de SPH, l'utilité que j'ai trouvé à ce transfert, c'est de coder des fichiers simplement en y ajoutant une valeur ASCII ou autre pour chacun des chiffres et lettre obtenu dans le texte.

J'essaye de réaliser un décodeur de page internet, c'est a dire de mettre sur un site des pages TRES PERSONNELLES accessible dans le monde entier mais lisible que par mon logiciel.

Je les codes avant de les deposer sur le site ou en meme temps, puis à la lecture si c'est une page HTML ou au telechargement si c'est un autre fichier (ZIP, MP3 etc ...) je les decode avant qu'il n' arrivent sur le DD.

C'est vrai cela va beaucoup ralentir la lecture, mais la confidentialité n'a pas de prix.C'est la raison pour laquelle la rapidité a beaucoup d'importance pour mon projet.

C'est un peu pour remplacer une cle USB quand on l'a oublié chez soi avec la seule limite de la capacité du serveur .

Vala, vala.

Excelente journée à tous et au plaisir de vous lire.

Re: Utilisation du texte

Publié : mar. 19/sept./2006 5:35
par SPH
andrebernard a écrit :J'essaye de réaliser un décodeur de page internet, c'est a dire de mettre sur un site des pages TRES PERSONNELLES accessible dans le monde entier mais lisible que par mon logiciel.
Et bien il y a BEAUCOUP mieux.
Mais voyons si j'ai bien compris :
Tu as differents fichiers personnels sur ton diskdur que tu souhaite mettre sur internet sans que personne ne puisse comprendre tes données, excepté ceux qui auront un lecteur special. C'est ca ??

Si oui, il y a plus rapide et + compressé !! (je ferais un code)

PS : les programmes ci dessus qu'on t'a proposé ne fonctionnent pas chez moi. Ca cré un fichier vide !

Publié : mar. 19/sept./2006 7:57
par Jacobus
Bien que je trouve l'idée intéressante, je dois dire que je suis dans la même situation que SPH, je n'obtiens que des fichiers vides dès que je veux dumper autre chose que des *.txt avec des temps records. dernier en date un zip de 7.8 Mo transformé en fichier vide en... 58 sec!! :?
Doit y avoir un truc, mais je n'ai pas cherché.