Conversion hexa/texte en binaire

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Conversion hexa/texte en binaire

Message 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
brossden
Messages : 831
Inscription : lun. 26/janv./2004 14:37

Message 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)
Denis

Bonne Jounée à tous
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Retour en arriere

Message 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
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message 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
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Correction

Message 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é.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Correction

Message 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
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Rapidité

Message 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.
brossden
Messages : 831
Inscription : lun. 26/janv./2004 14:37

Message 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")
Dernière modification par brossden le lun. 18/sept./2006 16:07, modifié 1 fois.
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message 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 ????
brossden
Messages : 831
Inscription : lun. 26/janv./2004 14:37

Message 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:
Denis

Bonne Jounée à tous
brossden
Messages : 831
Inscription : lun. 26/janv./2004 14:37

Message 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")
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message 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:
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Utilisation du texte

Message 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.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Utilisation du texte

Message 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 !
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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é.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre