Conversion d'un bou de code VB en PB

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

Conversion d'un bou de code VB en PB

Message par GallyHC »

Bonjour tout le monde,

J'aimerais convertir un bout de code de VB à PB mais je ne comprends pas tout :) la structure, les constantes, ect... ok mais c la partie de chargement qui me pose problème

Public Type ZIPFileHeader
Signature As Long
Version As Integer
GenePurpFlag As Integer
Methode As Integer
LastFileTime As Integer
LastFileData As Integer
Crc32 As Long
SizeComp As Long
SizeUnComp As Long
FileNameLen As Integer
ExtraLen As Integer
End Type
Public Const LOCSIG As Long = &H4034B50
Private LOCHdr As ZIPFileHeader

Jusque la tout est OK.

Code : Tout sélectionner

    Open vFileName For Binary Access Read Lock Write As #f
    Get #f, , LOCHdr
    If LOCHdr.Signature = LOCSIG Then
    End If
La partie qui me pose problème.

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
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Conversion d'un bou de code VB en PB

Message par flaith »

Vite fait, peut-être que cela ira :

Code : Tout sélectionner

Structure sZIPFileHeader
  Signature.l
  Version.i
  GenePurpFlag.i
  Methode.i
  LastFileTime.i
  LastFileData.i
  Crc32.l
  SizeComp.l
  SizeUnComp.l
  FileNameLen.i
  ExtraLen.i
EndStructure

#FileToRead   = 0
#LOCSIG       = $04034B50
filename$     = "test.bin"

Global LOCHdr.sZIPFileHeader

If OpenFile(#FileToRead,filename$)
  ReadData(#FileToRead,LOCHdr,SizeOf(sZIPFileHeader))
  If LOCHdr\Signature = #LOCSIG
    MessageRequester("","Found signature")
    CloseFile(#FileToRead)
  EndIf
EndIf
:mrgreen:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Conversion d'un bou de code VB en PB

Message par Kwai chang caine »

J'vais encore me coucher moins bete ce soir....
C'est quoi une signature dans un ZIP ???? 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un bou de code VB en PB

Message par GallyHC »

Bonjour,

La signature est juste un tag qui permet de vérifier si cela est bien un zip ou pas...

Merci flaith c'est bien ce que je recherche a faire. En fait je vais faire un module qui lit et extrait les zip pour que e soit multi-plate-forme.

encore une question et "Get #f, i, Temp" je fais comment?

Cordialement,
GallyHC

PS: si ce projet interresse quelqu'un pour m'aide pas de prob :)
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Conversion d'un bou de code VB en PB

Message par flaith »

GallyHC a écrit :..."Get #f, i, Temp" je fais comment?...
Je ne connais pas VB, mais cette fonction "get" permet vraisemblablement de rechercher dans le fichier "#f", à la position "i", une valeur à mettre dans "temp" qui doit être de type Long ou Integer probablement
En Purebasic, cela se traduirait par :

Code : Tout sélectionner

Global.i i
Global *temp

i = 24

FileSeek(#FileToRead, i)
*temp = AllocateMemory(SizeOf(i))
ReadData(#FileToRead, *temp, SizeOf(i))
Debug RSet(Hex(PeekI(*temp)),SizeOf(i)*2,"0")
:mrgreen:
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un bou de code VB en PB

Message par GallyHC »

Bonjour,

Vraiment merci sa m'aide beaucoup :) je me permettrais de demande votre aide en cas de besoin. dans tout les cas je ferais comme dab je partagerais ce que j'aurais fait :)

Amitié,
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
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Conversion d'un bou de code VB en PB

Message par Kwai chang caine »

Merci pour l'info :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un bou de code VB en PB

Message par GallyHC »

Bonjour,

J'ai encore un problème, maintenant il faudrait que je puisse ouvrir un fichier et prendre une partie (n’ importe où par exemple 1+100) et de prendre x bits pour le mettre dans une variable.

Merci d'avance de votre aide,
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
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conversion d'un bou de code VB en PB

Message par djes »

Regarde l'exemple de Fileseek()

Code : Tout sélectionner

  file$ = OpenFileRequester("Select a file","","Text (.txt)|*.txt|All files (*.*)|*.*",0)
  If file$
    If ReadFile(0, file$) 
      length = Lof(0)                       ; Lit la taille en octets du fichier
      FileSeek(0, length - 10)              ; place le pointeur 10 caractères avant la fin du fichier
      Debug "Position: " + Str(Loc(0))      ; Affiche la position du pointeur
      *MemoryID = AllocateMemory(10)        ; alloue un bloc mémoire pour 10 octets
      If *MemoryID
        bytes = ReadData(0, *MemoryID, 10)  ; Lit les 10 derniers caractères du fichier
        Debug PeekS(*MemoryID)
      EndIf
      CloseFile(0)
    EndIf
  EndIf  
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Conversion d'un bou de code VB en PB

Message par flaith »

ou ca :

Code : Tout sélectionner

#FileToRead   = 10

Global EndPos.l
Global *Buffer

Procedure.l ptr_FileSeek(seekpos.l, length.l)

  If seekpos+length >= EndPos
    MessageRequester("Erreur","Dépassement de la position recherchée !")
    End
  Else
    FileSeek(#FileToRead, seekpos)
    *buffer = AllocateMemory(length)
    If *buffer
      If ReadData(#FileToRead, *buffer, length) = length
        ProcedureReturn *Buffer
      Else
        MessageRequester("Erreur","Problème de lecture des données tronquée !!!")
        End
      EndIf
    Else
      MessageRequester("Erreur","Problème d'allocation de la mémoire !!!")
      End
    EndIf
  EndIf
EndProcedure

Procedure ExtractData(filename.s, seekpos.l, length.l)
Protected *adresse
Protected debut.l, val.l

  If ReadFile(#FileToRead, filename)
    EndPos = Lof(#FileToRead)
    *adresse = ptr_FileSeek(seekpos.l, length.l)

    debut = 0
    While debut < length
      ; on peut aussi créer une liste pour mettre chaque valeur
      val = PeekL(*adresse + debut)
      Debug RSet(Hex(seekpos+debut),8,"0")+":"+RSet(Hex(val), 2, "0") + " - " + Chr(val)
      debut + 1
    Wend
    CloseFile(#FileToRead)
  Else
    MessageRequester("Erreur fichier",filename+" non trouvé !!!")
    End
  EndIf
EndProcedure

ExtractData("C:\Nico\___GEWAD___\GeWAD.exe",$c70,20)
:mrgreen:
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion d'un bou de code VB en PB

Message par GallyHC »

Bonjour et merci pour vos exemple,

J'ai fais le code ci-dessous :

Code : Tout sélectionner

Procedure Extract_Level_8(filenums.l)
;
  Define lfllen.l
  Define *temp.l

  If ReadFile(#READZIP, szipfilenme)
    lfllen = Lof(#READZIP)
    FileSeek(#READZIP, 1 + sfileinf(filenums)\DataOffset)
    
    Debug "Position: " + Str(Loc(0))
    Debug "Taille: " + Str(sfileinf(filenums)\SizeComp)
    
    *temp = AllocateMemory(sfileinf(filenums)\SizeComp)
    ReadData(#READZIP, *temp, sfileinf(filenums)\SizeComp)
    If PeekI(temp) = #CENSIG
      Debug "Pass"
    EndIf
    CloseFile(#READZIP)
  EndIf

EndProcedure
en gros sa ressemble a celui de Djes, avec comme valeur

filenums)\DataOffset = 145862
sfileinf(filenums)\SizeComp = 356

Mon problème est que a la ligne "*temp = AllocateMemory(sfileinf(filenums)\SizeComp)" j'ai une erreur, "Invalid memory access (read error at address 1634561908)" et je ne comprend pas pourquoi?

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
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conversion d'un bou de code VB en PB

Message par djes »

Je vois beaucoup de sources d'erreurs possibles. Il faut éviter de déclarer les .l maintenant (le .i les remplace, mais tant qu'à faire, autant ne rien mettre); apparemment tu utilises beaucoup les variables globales; enfin le szipfilenme me semble suspect. Dans l'état actuel des choses, il vaudrait mieux appeler le debugger et faire du pas à pas jusqu'à trouver où se situe l'erreur.
Répondre