Individuare in un file compilato .gambas gli eventuali file esterni in esso allegati

Da Gambas-it.org - Wikipedia.

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 degli eventuali file esterni, allegati nella cartella "Dati " dell'IDE di Gambas, viene salvaguardato per intero ed in modo grezzo (senza alcun tipo di compressione) all'interno del corpo del file compilato .gambas, diventando così ciascuno di essi un coerente 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
   
' Verifica che il file caricato sia effettivamente un eseguibile .gambas:
   If Mid(dati, 17, 5) <> "gbr3\n" Then Error.Raise("Il file caricato non è un eseguibile .gambas !")
   
' 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