Autore Topic: Converitire file binario in hex  (Letto 4418 volte)

Offline distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Converitire file binario in hex
« il: 14 Luglio 2012, 09:27:47 »
Salve ragazzi , spero che qualche buon anima mi aiuti in cio' .....ho la necessita' di convertire il contenuto di un file letto da una memoria EEPROM da binario ( eeprom.bin) in vaolri HEX ( 0-255)

Spigo meglio  tramite un button_clik , apro la Dialog.openfile e seleziono il file *.bin e lo deposito in una variabile , a questo punto ho la necessita' di convertire l'intero file da bin ---> HEX e di sostituire dei precisi valori in hex (0-255) in determinate posizioni del file .Successivamente riconvertire il file in formato binario  e salvarlo in *.bin

spero che qualcuno mi aiuti ......nel caso anche in pm ! :-\

gentilissimi

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #1 il: 14 Luglio 2012, 10:16:33 »
Facendo la ricerca sul forum troverai molte discussioni inerenti alla questione che poni, in modo particolare sull'uso dei metodi Read e Write.

.... in valori HEX ( 0-255)
....di convertire l'intero file da bin ---> HEX e di sostituire dei precisi valori in hex (0-255)...
Suppongo tu voglia intendere in valori di tipo Byte espressi in rappresentazione decimale (0-255).... comunque sia, se tu già conosci la posizione nel file del byte da modificare puoi operare molto velocemente.
Mettiamo di avere un file contenente i seguenti byte (li riporto in decimale): 100, 101, 102, 103. Intendiamo cambiare il 2° byte da 101 a 107.
Operiamo velocemente così:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

 Dim fl As File

  fl = Open "/percorso/del/mio/file" For Write
 
' Mi sposto con il puntatore all'interno del file nella posizione 1 (ossia la 2^):
  Seek #fl, 1

' Quindi vado a scrivere il valore 107 (che in esad. è 6B):
  Write #fl, 107 As Byte    ' (As Byte è necessario con Gambas 3 !)

' Se mi piace utilizzare la "rappresentazione" esadecimale del byte:
' Write #fl, &6B As Byte

   fl.Close

End



oppure per manipolarlo con più calma puoi trasferirne i byte in un'apposita variabile:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

 Dim fl As File
 Dim a As New Byte[]
 Dim j, h As Byte

  fl = Open "/percorso/del/mio/file" For Read

  While Not Eof(fl)   ' fin tanto che non sono giunto alla fine del file...
    Read #fl, j          '...lo leggo byte per byte,
    a.Add(j)              ' che vado ad aggiungere negli elementi dell'array.
  Wend
 
  fl.Close
 
 '''''
' cambio i valore dell 2° elemento dell'array, come da intenzioni iniziali, in 107 (che in esad. è 6B):
  a[1] = 107
 
  '''''
 
' Vado a salvare il nuovo contenuto in un altro file (...tanto per avere anche il vecchio).
' Poiché questo file non esiste, lo devo creare "ex novo"; e pertanto userò la parola: ''Create'':
  fl = Open "/percorso/del/mio/nuovo/file_2" For Create

  For h = 0 To a.Max
    j = a[h]
   Write #fl, j As Byte    ' (As Byte è necessario con Gambas 3 !)
  Next

  fl.Close

End




Letture utili:
http://gambaswiki.org/wiki/lang/open
http://gambaswiki.org/wiki/lang/write

Potrebbe esserti utile anche questa pagina della WIKI:
https://www.gambas-it.org/wiki/index.php/Read
« Ultima modifica: 21 Marzo 2023, 12:15:36 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #2 il: 15 Luglio 2012, 12:29:49 »
grazie mille per la disponibilita' , e la velocita' nel rispondere alla mia domanda.In questi giorni provo subito il tutto e faccio sapere se ho avuto difficolta' in merito !

gentilissimi come sempre

Offline distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #3 il: 16 Luglio 2012, 10:03:15 »
Sicuro ho fatto un casotto , date un occhiata per una correzzione ! grazie mille



PUBLIC SUB Button1_Click()

DIM fileAAA AS File

'apertura file

Dialog.Title = " Load file .... "
Dialog.Filter = ["*.bin", "bin file", "*.ori", "ori file"]
Dialog.OpenFile
fileAAA = File.Load(Dialog.Path)

fileAAA = OPEN "fileAAA" FOR WRITE

' Mi sposto con il puntatore all'interno del file nella posizione 1: 
SEEK #fileAAA, 1

' Quindi vado a scrivere il valore 107 (che in esad. è 6B): 

WRITE #fileAAA, 107 'AS Byte    ' (As Byte è necessario con Gambas 3 !) 

' Se mi piace utilizzare la "rappresentazione" esadecimale del byte: 
' Write #fl, &6B As Byte 

fileAAA.Close

PRINT fileAAA ' per vedere se ha cambito il byte da me richiesto

END

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #4 il: 16 Luglio 2012, 10:14:20 »
Sicuro ho fatto un casotto , date un occhiata per una correzzione ! grazie mille

PRINT fileAAA ' per vedere se ha cambito il byte da me richiesto


Per "vedere" il file - binario -lo devi aprire in "Lettura":
Codice: gambas [Seleziona]

 variabileFile = Open "/percorso/del/mio/file/che/voglio/aprire" For Read

ed andarlo a leggerlo con:
Codice: gambas [Seleziona]

 Dim by As Byte
 .......
 .......
 Read #variabileFile, by


....sostanzialmente. Ma per leggerlo, devi anche qui far spostare il puntatore interno con Seek, se vuoi puntare ad un byte in particolare. Se vuoi leggere tutto il file e non conosci la dimensione del file, puoi fare così con un ciclo:
Codice: gambas [Seleziona]

  While Not Eof(variabileFile)   ' fintantoché non è giunto alla fine del file.....
    Read #variabileFile, by
      Print by     ' vado a vedere in console il byte in quel momento letto
  Wend


Poi quel fileAAA = File.Load(Dialog.Path) non ti fa gestire il file binario, ma te lo fa gestire come stringa. Infatti prova a fare:
Codice: gambas [Seleziona]

....
Dim w as String

If Dialog.OpenFile() Then Return
w = File.Load(Dialog.Path)

Print w

Vedi cosa esce in console.


Se tu vuoi gestirti il file binario, devi appunto usare Open, ma sopra devi sostituire così:
Codice: gambas [Seleziona]

Dim percorso_del_mio_file As String
Dim variabileFile As File

If Dialog.OpenFile() Then Return
percorso_del_mio_file = Dialog.Path

' quindi l'apertura del file:
 variabileFile = Open percorso_del_mio_file For Write
« Ultima modifica: 18 Agosto 2014, 10:53:41 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #5 il: 16 Luglio 2012, 13:34:59 »
Puoi aprire il file in READ WRITE, così puoi usare Seek, e al contempo anche scriverci sopra...

Offline distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #6 il: 16 Luglio 2012, 14:45:44 »
ciao , in queste istruzioni da voi indicate fate riferimento nel dare un indirizzo :

   1. Dim percorso_del_mio_file As String 
   2. Dim variabileFile As File 
   3.   
   4. If Dialog.OpenFile() Then Return 
   5. percorso_del_mio_file = Dialog.Path 
   6.   
   7. ' quindi l'apertura del file: 
   8. variabileFile = Open percorso_del_mio_file For Write 

la cosa che serve invece e' di non dare il percorso del file scritto nelle righe di programma ma farlo prendere in automatico tramite la Dialog.openfile ( altrimenti non avrebbe senso usare tale istruzione che rende il sw graficamente per un utenza ! :rolleyes:

in pratica devo aprire il file tramite la dialog.openfile ! :-\

grazie mille


Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #7 il: 16 Luglio 2012, 15:47:01 »
ciao , in queste istruzioni da voi indicate fate riferimento nel dare un indirizzo :

   1. Dim percorso_del_mio_file As String  
   2. Dim variabileFile As File  
   3.  
   4. If Dialog.OpenFile() Then Return  
   5. percorso_del_mio_file = Dialog.Path  
   6.  
   7. ' quindi l'apertura del file:  
   8. variabileFile = Open percorso_del_mio_file For Write  

la cosa che serve invece e' di non dare il percorso del file scritto nelle righe di programma ma farlo prendere in automatico tramite la Dialog.openfile ( altrimenti non avrebbe senso usare tale istruzione che rende il sw graficamente per un utenza ! :rolleyes:
in pratica devo aprire il file tramite la dialog.openfile ! :-\
Il "percorso", di cui parliamo, è semplicemente - appunto - il percorso del file scelto attraverso la finestra di dialogo Dialog.OpenFile().
Quando si impone l'apertura del file, Open domanda: « quale è 'sto file che devo aprire ? E soprattutto, dove sta ? ».
Poiché Open non è onniveggente come San Midi o onnipresente nello spazio profondo come Ceskho  ;D , sei costretto ad indicargli dove sta il file che gli vuoi far aprire, e la finestra di dialogo è solo un mezzo che ti facilita le cose evitando che debba tu scrivere l'intero percorso.
Ovviamente, se il file da aprire con il programma non è sempre lo stesso, ma potrà variare di volta in volta (e lo andrai a scegliere - appunto - con l'apposita finestra di dialogo), il percorso - raccolto attraverso la finetra di dialogo, lo vai a gestire con una variabile (...le variabili in fondo servono appunto in casi come questi, giacché ...l'universo non è tutto e sempre uguale ed identico a se stesso  ;D ). La variabile, appunto, è proprio lo strumento che ti consente di... variare al variare delle situazioni.
Noi non t'abbiamo suggerito di fissare un unico e solo percorso in eterno.  :angel: Infatti io ti avevo posto una variabile stringa Dim percorso_del_mio_file As String che verrà riempita dal percorso che - di volta in volta - tu... percorrerai nell'individuare il file da aprire, e che Open dovrà percorrere per aprire quel file da te scelto con la finestra di dialogo.


Per md9327 :
...sono stato un po' troppo mistico ?  :-X
« Ultima modifica: 17 Luglio 2012, 15:32:59 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #8 il: 16 Luglio 2012, 18:23:34 »
Più che mistico, mi sembra che la virulenza ceskhoniana stia mutando in peggio...  ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #9 il: 16 Luglio 2012, 23:10:39 »
Più che mistico, mi sembra che la virulenza ceskhoniana stia mutando in peggio...  ;D

Dunque, non è puro slancio mistico, non anelito al divino, ma un triste sintomo patologico !  :-X
« Ultima modifica: 16 Luglio 2012, 23:12:30 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #10 il: 17 Luglio 2012, 11:03:12 »
Ecco, qui sei quasi mistico, anzi direi quasi arcano, anzi... vabbè, lasciamo perdere...  :rotfl:

Offline distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Converitire file binario in hex
« Risposta #11 il: 17 Luglio 2012, 11:49:57 »
grazie mille , basta essere espliciti nello spiegare e tutto torna !

sono riuscito nell'intento di leggere il valore alla precisa posizione .


grandi !!!   ;)