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é.