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

Da Gambas-it.org - Wikipedia.
Versione del 21 giu 2024 alle 17:06 di Vuott (Discussione | contributi)

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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
 
  Do  ' ...ὁ ἄπειρος κύκλος !
' 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
  Loop   
   
  fl.Close
   
End