dump hexadecimal

Programmation d'applications complexes
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

dump hexadecimal

Message par Patrick88 »

après une recherche infructueuse sur le net, j'ai écrit ce machin rapidos

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
ça fait ce dont j'ai besoin : prendre un fichier de n'importe quel type et le transformer en fichier texte....

si quelqu'un a le temps de le fignoler, qu'il ne s'en prive pas...

patrick
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

...
Dernière modification par Dr. Dri le lun. 10/oct./2005 9:02, modifié 1 fois.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

0D,00,0A,0C,72,3D,31,32,33,2E,32,35,0D,00,.......

patrick
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Voici un code de Danilo publié sur le forum anglais (j'ai gardé le code) et que je viens de modifier pour la 3.90 (AllocateMemory etc)

A adapter pour les besoins

Code : Tout sélectionner

;>--------------------------------------------------------
;>--------------------------------------------------------
;
; Pure HexView, by Danilo, 22.01.2003
;
; Thanks go to 'PB' and 'horst' for
; ideas and hints!
;
DisableDebugger ; !!

;
;- Structures
;
; Structure BYTE
;   b.b
; EndStructure
; 
;
;- Global variables - arrays - linked lists
;
Dim AsciiChars.b(255)
For a =   0 To 255 : AsciiChars(a) = '.' : Next a
For a =  32 To 127 : AsciiChars(a) = a   : Next a

Dim HexChars.b(16)
PokeS(HexChars(),"0123456789ABCDEF")

;
;- Procedures
;
Procedure AskForEnd()
  If MessageRequester("Exit","Really exit 'Pure HexView' ?",#MB_YESNO|#MB_ICONQUESTION) = #IDYES
     End
  EndIf
EndProcedure


; Procedure MOD(a,b)
;   ProcedureReturn a-a/b*b
; EndProcedure


Procedure FillListViewHex(*mem.BYTE,size)
  ;
  ; Fill Listview with hex values
  ; argument 1: memory-pointer for data
  ; argument 2: size of this memory area
  ;
  ;Delay(1)
  StartTime = TimeGetTime_()
  SendMessage_(GadgetID(1),#WM_SETREDRAW, #FALSE, 0)

  A$ = Space(16*4)
  PokeB(@A$+16*3,'|')
  For a = 1 To size/16
    *Text.Byte = @A$
    *RealText.Byte = @A$+16*3+2
    For b = 1 To 16
      *Text\b = HexChars((*mem\b & $FF) >> 4);*offset\b ;PeekB(@HEX$ + offset)
      *Text+1
      *Text\b = HexChars((*mem\b & $F));*offset\b ;PeekB(@HEX$ + offset)
      *Text+2
      *RealText\b = AsciiChars(*mem\b & $FF)
      *RealText+1
      *mem + 1 
    Next b
    AddGadgetItem(1,-1,A$)
  Next a

  b = MOD(size,16)
  If b
    A$ = Space(16*4)
    PokeB(@A$+16*3,'|')
    *Text.Byte = @A$
    *RealText.BYTE = @A$+16*3+2
    For a = 1 To b
      *Text\b = HexChars((*mem\b & $FF) >> 4)
      *Text+1
      *Text\b = HexChars((*mem\b & $F))
      *Text+2
      *RealText\b = AsciiChars(*mem\b & $FF)
      *RealText+1
      *mem + 1 
    Next a
    AddGadgetItem(1,-1,A$)
  EndIf
  SendMessage_(GadgetID(1),#WM_SETREDRAW, #True, 0)
  EndTime   = TimeGetTime_() - StartTime
  ;MessageRequester("INFO","Filled ListViewGadget with "+StrU(size,2)+" HEX values in "+StrU(EndTime,2)+" ms",0)
  SetGadgetText(3,StrU(size,2)+" bytes - "+StrU(size/16+b,2)+" lines generated in "+StrU(EndTime,2)+" ms")
EndProcedure


Procedure LoadFileInListView()
  File$ = OpenFileRequester("Load File","","All Files | *.*",0)
  If File$
    If ReadFile(1,File$)
       size = Lof()
       If size > 200*1024
         If MessageRequester("Warning","Really load BIG file "+GetFilePart(File$)+" ("+StrU(size,2)+" bytes) ??"+Chr(13)+"This can take much time!",#MB_ICONWARNING|#MB_YESNO) = #IDNO 
            CloseFile(1)
            ProcedureReturn
         EndIf
       EndIf
       mem  = AllocateMemory(size)
       If mem = 0
         MessageRequester("ERROR","Cant allocate "+StrU(size,2)+" bytes of memory!",#MB_ICONERROR)
         CloseFile(1)
         ProcedureReturn
       EndIf
       ReadData(mem,size)
       CloseFile(1)
       ClearGadgetItemList(1)
       SetGadgetText(3,"File "+GetFilePart(File$)+" loaded ... generating HexView")
       While WindowEvent():Wend
       FillListViewHex(mem,size)
       FreeMemory(1)
    Else
      MessageRequester("ERROR","Cant read file!",#MB_ICONERROR)
    EndIf
  EndIf
EndProcedure

;
;- App START
; 
OpenWindow(1,0,0,760,520,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"Pure HexView")
   hFont = LoadFont(1,"Lucida Console",14)
   CreateGadgetList(WindowID())
   ListViewGadget(1,0,0,760,500): SendMessage_(GadgetID(1),#WM_SETFONT,hFont,1)
   ButtonGadget(2,640,501,120,20,"Load File in ListView")
   SetGadgetFont(2, hFont)
   TextGadget(3,0,501,640,20,"",#PB_Text_Center)
   
   While WindowEvent():Wend

   ; produce 32k random data memory for speed testing :)
   mem_data_size = 32*1024
   *mem_data.BYTE = AllocateMemory(mem_data_size)
   *mem.BYTE = *mem_data
   For a = 1 To mem_data_size
     *mem\b = Random($FF)
     *mem + 1
   Next a
   PokeS(*mem_data,"HexViewer for PB")
   For a = 0 To 255 : PokeB(*mem_data+16+a,a) : Next a
   PokeS(*mem_data+mem_data_size-12,"__The End__")

   ; Fill ListViewGadget with random data
   FillListViewHex(*mem_data,mem_data_size)
   
   ; Free random data memory
   FreeMemory(1)

;
;- App message loop
;
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow : AskForEnd()
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case 2 : LoadFileInListView()
      EndSelect    
  EndSelect
ForEver
;
;- App END
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

Denis -> instruction mod() non reconnue.... :cry:

Patrick
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Retire les ; devant les 3 lignes 38,39 et 40

; Procedure MOD(a,b)
; ProcedureReturn a-a/b*b
; EndProcedure

Cette commande fait partie d'une lib externe et comme j'en ai un paquet, je ne sais plus c'est laquelle.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

en adaptant un chouille mon truc , un petit utilitaire pour importer les fichiers texte qui proviennent de linux et qui n'ont pas le couple retour chariot, saut de ligne, qui empèche de les éditer correctement dans pb (rajoute $0d/$0a, chaque fois qu'il rencontre $0a )

Code : Tout sélectionner

  Repeat 
      octet=ReadByte()
      UseFile(#dst)
      If octet=$A
        octet=$D : WriteByte(octet)
        octet=$A : WriteByte(octet)
      Else
        WriteByte(octet)
      EndIf
      UseFile(#src)
    Until Loc()=Lof()


c'est pas grand chose mais ça dépanne bien

patrick
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

@denis

maintenant ( depuis pb 3.81 je crois ) tu peux faire :

modulo.l = a % b
Image
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ha bon, en fait je me suis rapellé que j'avais vu passer un code de Danilo sur un éditeur hexa et j'ai lancé mais ça compilat pas alors petites modifs et voilà.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Impossible de compiler ton code Denis :? :x
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

c'est la fonction modulo qui pose pb surement
regarde plus haut dans ce meme post...
Image
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Et dans l'autre sens ???

Message par andrebernard »

Bonjour à tous

Le code de Patrick88 est vraiment genial, c'est ce que je cherchais :

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 
Mais voila comment feriez vous pour revenir en arriere, c'est a dire une fois que tu as le fichier texte avec tous les chiffres hexa dedans pour obtenir a nouveau un exe ou une image

Je vous remercie
Bonne journée
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par 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

#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
Répondre