...dunque, 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).
Come ho già detto nel precedente messaggio, 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 !
Al riguardo ho scritto questo 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