Page 1 sur 1
dump hexadecimal
Publié : sam. 08/mai/2004 20:35
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
Publié : sam. 08/mai/2004 20:51
par Dr. Dri
...
Publié : sam. 08/mai/2004 21:08
par Patrick88
0D,00,0A,0C,72,3D,31,32,33,2E,32,35,0D,00,.......
patrick
Publié : dim. 09/mai/2004 11:42
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
Publié : dim. 09/mai/2004 11:49
par Patrick88
Denis -> instruction mod() non reconnue....
Patrick
Publié : dim. 09/mai/2004 11:57
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.
Publié : dim. 09/mai/2004 15:09
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
Publié : dim. 09/mai/2004 16:42
par Flype
@denis
maintenant ( depuis pb 3.81 je crois ) tu peux faire :
modulo.l = a % b
Publié : dim. 09/mai/2004 20:08
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à.
Publié : dim. 09/mai/2004 20:52
par nico
Impossible de compiler ton code Denis

Publié : dim. 09/mai/2004 21:03
par Flype
c'est la fonction modulo qui pose pb surement
regarde plus haut dans ce meme post...
Et dans l'autre sens ???
Publié : dim. 10/sept./2006 20:03
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
Publié : lun. 11/sept./2006 17:50
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