Page 1 sur 1
Chargement d'un fichier binaire.
Publié : lun. 29/mars/2010 18:11
par GallyHC
Bonjour,
Je voudrais savoir si il est possible de chager rapidement un fichier et le mettre dans une variable, un peu comme avec VB. Enfin mettre un fichier complet dans une variable (le fichier fait a peu pres 15Mo).
Cordialement,
GallyHC
Re: Chargement d'un fichier binaire.
Publié : lun. 29/mars/2010 19:29
par cederavic
Salut,
Les commandes de PB ne sont pas assez rapides?
Code : Tout sélectionner
LoadFile(#Fichier, "fichier")
*Buffer = AllocateMemory(LoF(#Fichier))
ReadData(#Fichier, *Buffer, LoF(#Fichier))
Re: Chargement d'un fichier binaire.
Publié : lun. 29/mars/2010 20:35
par Ar-S
cederavic a écrit :Salut,
Les commandes de PB ne sont pas assez rapides?
Code : Tout sélectionner
LoadFile(#Fichier, "fichier")
*Buffer = AllocateMemory(LoF(#Fichier))
ReadData(#Fichier, *Buffer, LoF(#Fichier))
Tu veux dire ReadFile ?
Re: Chargement d'un fichier binaire.
Publié : lun. 29/mars/2010 21:42
par GallyHC
Bonjour et merci,
Donc j'etais bien dans le vrai. IL y a juste un problème en récuperant le fihcier pour le mettre dans une variable par peeks(), des qu'il trouve un caractere Null il stop.
Voici un exemple qui charge la calculatrice :
Code : Tout sélectionner
NomFichier$ = "c:\windows\system32\calc.exe"
Define i.l
Define j.l
Define bytes.i
Define result.s
Define *MemoryID.i
If ReadFile(0,NomFichier$)
*MemoryID =AllocateMemory(Lof(0))
If *MemoryID
bytes = ReadData(0, *MemoryID, Lof(0))
result = PeekS(*MemoryID, Lof(0))
FreeMemory(*MemoryID)
Debug result
EndIf
EndIf
En resultat on obtien que "MZ", mais le fichier est beaucoup plus gros. Comment faire pour résoudre ce problème?
Cordialement,
GallyHC
Re: Chargement d'un fichier binaire.
Publié : lun. 29/mars/2010 22:15
par G-Rom
Tu as Lof() , la longueur en byte du fichier
de là , tu fait un for/next , puis à coup de pokec() tu lis les caractères.
@+
Re: Chargement d'un fichier binaire.
Publié : lun. 29/mars/2010 22:32
par flaith
** edit **
je ne vois pas pourquoi je perd mon temps à essayer d'aider les gens ici

Re: Chargement d'un fichier binaire.
Publié : lun. 29/mars/2010 23:00
par GallyHC
Salut G-Rom,
Autemps que je lise ligne par ligne et que je copie dans une variable, c pas plus rapide ni plus lent. Je ne comprend pas l'interrer d'arrête a un caractere null. Sutout pour charge de gros fichier.
Cordialement,
GallyHC
Re: Chargement d'un fichier binaire.
Publié : lun. 29/mars/2010 23:10
par case
peeks() lis une chaine de caractère (comprendre par la du texte) terminée par un octet nul normalement il n'y a pas d'octet nul dans une chaine de caractères
toi tu lis du binaire donc peeks() ne conviens pas a cet usage
sinon une question me taraude , pourquoi tiens tu a lire un fichier binaire dans une variable ?
dans tout les cas si tu met un fichier binaire dans une chaine de caractere tu ne pourra jamais aller plus loin que le premier code null rencontré car toute les chaines de caractere en memoire sont terminées par un zero et ce independament du langage je crois
[quote=Grom]Tu as Lof() , la longueur en byte du fichier
de là , tu fait un for/next , puis à coup de
pokec() tu lis les caractères.[/quote]
lire PEEKC() bien sur ^^
ceci dit, pour charger un fichier dans une string tu peux faire
Code : Tout sélectionner
var.string
rd=ReadFile(#PB_Any,"calc.exe")
var\s=space(lof(rd))
ReadData(rd,@var\s,lof(rd))
CloseFile(rd)
physiquement le fichier sera dans la variable mais celle ci ne sera vu par pb que jusqu'au premier caractere nul rencontré...
un len(var\s) donnera toujours pareil 4...
enfin ca serait pas mal que tu nous dise le pourquoi du comment la je comprend pas l'utilité de faire cela alors qu'il existe des buffer memoires

Re: Chargement d'un fichier binaire.
Publié : lun. 29/mars/2010 23:34
par Ar-S
Je vais tenter d'expliquer la chose,
GallyHC corrige si je me trompe.
En gros on a un fichier binaire dans le quel il y a des string genre "toto", "bibi".
Le but est donc de chercher à charger en mémoire le fichier binaire comme une suite de caractères afin de rechercher les termes "toto" ou "bibi" directement dans la mémoire.
Re: Chargement d'un fichier binaire.
Publié : mar. 30/mars/2010 1:14
par case
si c'est juste pour une recherche il faut procéder autrement
Code : Tout sélectionner
Procedure findmem(*buffer,st.s,start=0)
string.string
string\s=st
size=Len(st)-1
pos=0
Repeat
If PeekC(*buffer+pos)<>PeekC(@string\s)
pos+1
Else
lpos=0
Repeat
If PeekC(*buffer+pos+lpos)=PeekC(@string\s+lpos)
lpos+1
Else
pos+1
Break 1
EndIf
Until lpos=size
If lpos=size
ProcedureReturn pos
EndIf
EndIf
Until pos=MemorySize(*buffer)
ProcedureReturn -1 ; ERREUR
EndProcedure
file$=OpenFileRequester("","*.*","*.*",1)
If FileSize(file$)>0
*mem=AllocateMemory(FileSize(file$))
rd=ReadFile(#PB_Any,file$)
If rd
ReadData(rd,*mem,Lof(rd))
CloseFile(rd)
EndIf
search$=InputRequester("memsearch","entrez une chaine","")
If search$<>""
pos=findmem(*mem,search$)
If pos=-1
Debug "erreur"
Else
Debug pos
EndIf
EndIf
FreeMemory(*mem)
EndIf
Re: Chargement d'un fichier binaire.
Publié : mar. 30/mars/2010 10:45
par GallyHC
Bonjour,
Voila Ar-s a bien explique et merci a toi case pour ce code. Il faudrais maintenant que l'on puisse recupere les parties de memoire qui ce trouve entre x et y trouvais par ta fonction.
Cordialement,
GallyHC
Re: Chargement d'un fichier binaire.
Publié : mar. 30/mars/2010 17:47
par case
GallyHC a écrit :Bonjour,
Voila Ar-s a bien explique et merci a toi case pour ce code. Il faudrais maintenant que l'on puisse recupere les parties de memoire qui ce trouve entre x et y trouvais par ta fonction.
Cordialement,
GallyHC
oO
je ne comprend pas bien ce que tu veux faire, ca serais pas mal que tu nous en dise un peu plus .
la on avance en aveugle et en plus il faut deviner ce que tu cherches a faire ,)
récupérer des parties, dans quel but ? les sauver sur disque ? les mettre dans une autre zone mémoire? les afficher ? ce n'est pas des choses tres compliquer mais encore faut il savoir exactement ce que tu veux.
Re: Chargement d'un fichier binaire.
Publié : mar. 30/mars/2010 17:57
par flaith
J'ose qd même répondre, la différence en y et x, tu alloues de la mémoire de la taille de cette différence et du fait un copymemory dans ce nouveau bloc mémoire
Re: Chargement d'un fichier binaire.
Publié : mar. 30/mars/2010 18:44
par G-Rom
GallyHC a écrit :Salut G-Rom,
Autemps que je lise ligne par ligne et que je copie dans une variable, c pas plus rapide ni plus lent. Je ne comprend pas l'interrer d'arrête a un caractere null. Sutout pour charge de gros fichier.
Cordialement,
GallyHC
ReadString() ? Autant utilisé ReadData() ou à coup de PeekC() ( Merci Ar-s ^^ )
PeekC() te permettais d'avoir une valeur Ascii , si tu rencontre un Zero , tu l'ignores (met en un à la fin quand même) , comme ca dès lors que tu appelles
Debug MaVar$ , tout est lu , et sa ne s'arrête pas au premier #Null rencontré.