Page 1 sur 1

Conversion d'un bou de code VB en PB

Publié : dim. 25/oct./2009 13:46
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

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

Publié : dim. 25/oct./2009 14:58
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:

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

Publié : dim. 25/oct./2009 16:03
par Kwai chang caine
J'vais encore me coucher moins bete ce soir....
C'est quoi une signature dans un ZIP ???? 8O

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

Publié : dim. 25/oct./2009 18:45
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 :)

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

Publié : dim. 25/oct./2009 20:35
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:

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

Publié : dim. 25/oct./2009 22:08
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

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

Publié : lun. 26/oct./2009 9:13
par Kwai chang caine
Merci pour l'info :wink:

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

Publié : jeu. 29/oct./2009 12:52
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

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

Publié : jeu. 29/oct./2009 13:29
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  

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

Publié : jeu. 29/oct./2009 13:51
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:

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

Publié : jeu. 29/oct./2009 16:41
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

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

Publié : jeu. 29/oct./2009 17:12
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.