Differenze tra le versioni di "Individuare in un file compilato .gambas gli eventuali file esterni in esso allegati"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "In linea generale, come ogni formato di file complesso anche i file con estensione .gambas (eseguibili e librerie Gambas) sono org...")
 
Riga 10: Riga 10:
  
 
Mostriamo un semplice applicativo per l'individuazione del byte (indice) di inizio e della dimensione di ciascun blocco costituente un file avente estensione ''.gambas'':
 
Mostriamo un semplice applicativo per l'individuazione del byte (indice) di inizio e della dimensione di ciascun blocco costituente un file avente estensione ''.gambas'':
 
+
Private Const INIZIO_ULTIMO_BLOCCO As String = "\x2Estartup\x2Eproject"
 
+
Private Const INIZIO_DATI_UTILI As String = "\x00\x00\x00\x00\x08\x00\x00\x00"
<FONT Color=Red size=4><B>Pagina in costruzione !</b></font>
+
 +
 +
'''Public''' Sub Main()
 +
 
 +
  Dim fl As File
 +
  Dim nomefile, dati, ultimi As String
 +
  Dim lung, posult, pos, dmn, n As Integer
 +
  Dim bl As Byte
 +
 
 +
    nomefile = "<FONT Color=gray>''/percorso/del/file.gambas''</font>"
 +
    Print "File eseguibile:  "; nomefile
 +
 
 +
<FONT Color=gray>' ''Apre in lettura il file con estensione ".gambas":''</font>
 +
    fl = Open nomefile For Read
 +
 
 +
<FONT Color=gray>' ''Apprende la dimensione del file:''</font>
 +
    lung = Lof(fl)
 +
    Print "Dimensione totale: "; lung; " byte"
 +
    Print
 +
 
 +
<FONT Color=gray>' ''Legge e carica in memoria tutti i dati del file ".gambas":''</font>
 +
    Read #fl, dati, lung
 +
 
 +
<FONT Color=gray>' ''Riposiziona il puntatore interno del file all'indice zero:''</font>
 +
    Seek #fl, 0
 +
   
 +
<FONT Color=gray>' ''Individua la posizione dell'ultimo blocco di dati del file ".gambas":''</font>
 +
    posult = InStr(dati, INIZIO_ULTIMO_BLOCCO)
 +
 
 +
<FONT Color=gray>' ''Prende in considerazione i soli dati dell'ultimo blocco:''</font>
 +
    ultimi = Right(dati, Len(dati) - posult)
 +
   
 +
<FONT Color=gray>' ''Effettua un ulteriore filtro, lasciando i soli dati a noi utili:''</font>
 +
    n = InStr(ultimi, INIZIO_DATI_UTILI)
 +
 
 +
<FONT Color=gray>' ''Calcola la posizione dei primi dati a noi utili:''</font>
 +
    n += posult - 1
 +
 
 +
    While True  <FONT Color=gray>' ''...ὁ ἄπειρος κύκλος !''</font>
 +
 
 +
<FONT Color=gray>' ''Sposta il puntatore interno del file in avanti:''</font>
 +
      Seek #fl, n + 8
 +
      Read #fl, pos
 +
      If pos < 0 Then
 +
        n = Seek(fl) + 4
 +
      Else
 +
        Inc bl
 +
        Read #fl, dmn
 +
        Print "Inizio "; bl; "° blocco al byte "; pos; "  - dimensione: "; dmn; " byte"
 +
        If Mid(dati, pos + dmn + 1, 16) = INIZIO_ULTIMO_BLOCCO Then
 +
          Inc bl
 +
          Print "Inizio "; bl; "° blocco al byte "; pos + dmn; "  - dimensione: "; lung - (pos + dmn); " byte"
 +
          Break
 +
        Endif
 +
        n = Seek(fl)
 +
      Endif
 +
     
 +
    Wend
 +
   
 +
    fl.Close
 +
   
 +
'''End'''

Versione delle 08:53, 27 ago 2016

In linea generale, come ogni formato di file complesso anche i file con estensione .gambas (eseguibili e librerie Gambas) sono organizzati internamente in blocchi coerenti.

Dopo gli iniziali byte il primo blocco coerente di dati ha inizio sempre al 57° byte (indice 56).


Va precisato che il codice sorgente dei file, allegati nella cartella "Dati " dell'IDE di Gambas, viene salvaguardato per intero nei sorgenti dei file compilati .gambas . Pertanto tutti i dati dei file allegati al progetto vengono salvati in modo grezzo (senza alcun tipo di compressione) all'interno del corpo del file eseguibile .gambas, diventando ciascuno un blocco a sé stante.

Poiché l'ultima parte dei file .gambas contiene sia l'indicazione del byte ove inizia ciascun blocco, sia la rispettiva dimensione in byte, sono non solo facilmente individuabili l'inizio e la fine dei dati, ma sono anche leggibili tutti quei dati !


Mostriamo un semplice applicativo per l'individuazione del byte (indice) di inizio e della dimensione di ciascun blocco costituente un file avente estensione .gambas:

Private Const INIZIO_ULTIMO_BLOCCO As String = "\x2Estartup\x2Eproject"
Private Const INIZIO_DATI_UTILI As String = "\x00\x00\x00\x00\x08\x00\x00\x00"


Public Sub Main()
 
 Dim fl As File
 Dim nomefile, dati, ultimi As String
 Dim lung, posult, pos, dmn, n As Integer
 Dim bl As Byte
 
   nomefile = "/percorso/del/file.gambas"
   Print "File eseguibile:   "; nomefile
 
' Apre in lettura il file con estensione ".gambas":
   fl = Open nomefile For Read
 
' Apprende la dimensione del file:
   lung = Lof(fl)
   Print "Dimensione totale: "; lung; " byte"
   Print
 
' Legge e carica in memoria tutti i dati del file ".gambas":
   Read #fl, dati, lung
 
' Riposiziona il puntatore interno del file all'indice zero:
   Seek #fl, 0
   
' Individua la posizione dell'ultimo blocco di dati del file ".gambas":
   posult = InStr(dati, INIZIO_ULTIMO_BLOCCO)
 
' Prende in considerazione i soli dati dell'ultimo blocco:
   ultimi = Right(dati, Len(dati) - posult)
   
' Effettua un ulteriore filtro, lasciando i soli dati a noi utili:
   n = InStr(ultimi, INIZIO_DATI_UTILI)
 
' Calcola la posizione dei primi dati a noi utili:
   n += posult - 1
 
   While True  ' ...ὁ ἄπειρος κύκλος !
 
' Sposta il puntatore interno del file in avanti:
     Seek #fl, n + 8
     Read #fl, pos
     If pos < 0 Then
       n = Seek(fl) + 4
     Else
       Inc bl
       Read #fl, dmn
       Print "Inizio "; bl; "° blocco al byte "; pos; "  - dimensione: "; dmn; " byte"
       If Mid(dati, pos + dmn + 1, 16) = INIZIO_ULTIMO_BLOCCO Then
         Inc bl
         Print "Inizio "; bl; "° blocco al byte "; pos + dmn; "  - dimensione: "; lung - (pos + dmn); " byte"
         Break
       Endif
       n = Seek(fl)
     Endif
     
   Wend
   
   fl.Close
   
End