Chargement d'un fichier binaire.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Chargement d'un fichier binaire.

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: Chargement d'un fichier binaire.

Message 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)) 
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Chargement d'un fichier binaire.

Message 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 ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Chargement d'un fichier binaire.

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Chargement d'un fichier binaire.

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

@+
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Chargement d'un fichier binaire.

Message par flaith »

** edit **
je ne vois pas pourquoi je perd mon temps à essayer d'aider les gens ici :(
Dernière modification par flaith le mar. 30/mars/2010 9:56, modifié 1 fois.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Chargement d'un fichier binaire.

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Chargement d'un fichier binaire.

Message 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 :)
ImageImage
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Chargement d'un fichier binaire.

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Chargement d'un fichier binaire.

Message 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


ImageImage
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Chargement d'un fichier binaire.

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Chargement d'un fichier binaire.

Message 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.
ImageImage
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Chargement d'un fichier binaire.

Message 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
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Chargement d'un fichier binaire.

Message 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é.
Répondre