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

Da Gambas-it.org - Wikipedia.
 
Riga 2: Riga 2:
  
 
Dopo gli iniziali byte il primo blocco coerente di dati ha inizio sempre al 57° byte (indice 56).
 
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.
 
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 !
 
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'':
 
Mostriamo un semplice applicativo per l'individuazione del byte (indice) di inizio e della dimensione di ciascun blocco costituente un file avente estensione ''.gambas'':
Riga 14: Riga 12:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
  Dim fl As File
+
  Dim fl As File
  Dim nomefile, dati, ultimi As String
+
  Dim nomefile, dati, ultimi As String
  Dim lung, posult, pos, dmn, n As Integer
+
  Dim lung, posult, pos, dmn, n As Integer
  Dim bl As Byte
+
  Dim bl As Byte
 
    
 
    
    nomefile = "<FONT Color=gray>''/percorso/del/file.gambas''</font>"
+
  nomefile = "<FONT Color=darkgreen>''/percorso/del/file.gambas''</font>"
    Print "File eseguibile:  "; nomefile
+
  Print "File eseguibile:  "; nomefile
 
    
 
    
 
  <FONT Color=gray>' ''Apre in lettura il file con estensione ".gambas":''</font>
 
  <FONT Color=gray>' ''Apre in lettura il file con estensione ".gambas":''</font>
    fl = Open nomefile For Read
+
  fl = Open nomefile For Read
 
    
 
    
 
  <FONT Color=gray>' ''Apprende la dimensione del file:''</font>
 
  <FONT Color=gray>' ''Apprende la dimensione del file:''</font>
    lung = Lof(fl)
+
  lung = Lof(fl)
    Print "Dimensione totale: "; lung; " byte"
+
  Print "Dimensione totale: "; lung; " byte"
    Print
+
  Print
 
        
 
        
 
  <FONT Color=gray>' ''Legge e carica in memoria tutti i dati del file ".gambas":''</font>
 
  <FONT Color=gray>' ''Legge e carica in memoria tutti i dati del file ".gambas":''</font>
    Read #fl, dati, lung
+
  Read #fl, dati, lung
 
      
 
      
 
  <FONT Color=gray>' ''Verifica che il file caricato sia effettivamente un eseguibile .gambas:''</font>
 
  <FONT Color=gray>' ''Verifica che il file caricato sia effettivamente un eseguibile .gambas:''</font>
    If Mid(dati, 17, 5) <> "gbr3\n" Then Error.Raise("Il file caricato non è un eseguibile .gambas !")
+
  If Mid(dati, 17, 5) <> "gbr3\n" Then Error.Raise("Il file caricato non è un eseguibile .gambas !")
   
+
 
 
  <FONT Color=gray>' ''Riposiziona il puntatore interno del file all'indice zero:''</font>
 
  <FONT Color=gray>' ''Riposiziona il puntatore interno del file all'indice zero:''</font>
    Seek #fl, 0
+
  Seek #fl, 0
 
      
 
      
 
  <FONT Color=gray>' ''Individua la posizione dell'ultimo blocco di dati del file ".gambas":''</font>
 
  <FONT Color=gray>' ''Individua la posizione dell'ultimo blocco di dati del file ".gambas":''</font>
    posult = InStr(dati, INIZIO_ULTIMO_BLOCCO)
+
  posult = InStr(dati, INIZIO_ULTIMO_BLOCCO)
 
    
 
    
 
  <FONT Color=gray>' ''Prende in considerazione i soli dati dell'ultimo blocco:''</font>
 
  <FONT Color=gray>' ''Prende in considerazione i soli dati dell'ultimo blocco:''</font>
    ultimi = Right(dati, Len(dati) - posult)
+
  ultimi = Right(dati, Len(dati) - posult)
 
      
 
      
 
  <FONT Color=gray>' ''Effettua un ulteriore filtro, lasciando i soli dati a noi utili:''</font>
 
  <FONT Color=gray>' ''Effettua un ulteriore filtro, lasciando i soli dati a noi utili:''</font>
    n = InStr(ultimi, INIZIO_DATI_UTILI)
+
  n = InStr(ultimi, INIZIO_DATI_UTILI)
 
    
 
    
 
  <FONT Color=gray>' ''Calcola la posizione dei primi dati a noi utili:''</font>
 
  <FONT Color=gray>' ''Calcola la posizione dei primi dati a noi utili:''</font>
    n += posult - 1
+
  n += posult - 1
 
 
    While True  <FONT Color=gray>' ''...ὁ ἄπειρος κύκλος !''</font>
 
 
    
 
    
 +
  Do  <FONT Color=gray>' ''...ὁ ἄπειρος κύκλος !''</font>
 
  <FONT Color=gray>' ''Sposta il puntatore interno del file in avanti:''</font>
 
  <FONT Color=gray>' ''Sposta il puntatore interno del file in avanti:''</font>
      Seek #fl, n + 8
+
    Seek #fl, n + 8
      Read #fl, pos
+
    Read #fl, pos
      If pos < 0 Then
+
    If pos < 0 Then
        n = Seek(fl) + 4
+
      n = Seek(fl) + 4
      Else
+
    Else
        Inc bl
+
      Inc bl
        Read #fl, dmn
+
      Read #fl, dmn
        Print "Inizio "; bl; "° blocco al byte "; pos; "  - dimensione: "; dmn; " byte"
+
      Print "Inizio "; bl; "° blocco al byte "; pos; "  - dimensione: "; dmn; " byte"
        If Mid(dati, pos + dmn + 1, 16) = INIZIO_ULTIMO_BLOCCO Then
+
      If Mid(dati, pos + dmn + 1, 16) = INIZIO_ULTIMO_BLOCCO Then
          Inc bl
+
        Inc bl
          Print "Inizio "; bl; "° blocco al byte "; pos + dmn; "  - dimensione: "; lung - (pos + dmn); " byte"
+
        Print "Inizio "; bl; "° blocco al byte "; pos + dmn; "  - dimensione: "; lung - (pos + dmn); " byte"
          Break
+
        Break
        Endif
+
      Endif
        n = Seek(fl)
+
      n = Seek(fl)
      Endif
+
    Endif
     
+
  Loop 
    Wend
 
 
      
 
      
    fl.Close
+
  fl.Close
 
      
 
      
  '''End'''
+
  End

Versione attuale delle 17:06, 21 giu 2024

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