Autore Topic: [RISOLTO] Azzerando un gruppo di byte in un file mediante Byte[]  (Letto 1156 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.238
  • Ne mors quidem nos iunget
    • Mostra profilo
Stavo sperimentando questo modo di azzerare all'interno di un file (composto ad esempio da questi 9 byte: 66 66 66 66 66 66 66 66 66) un certo numero di byte successivi (mettiamo... i primi 4):
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim aFl As File
  Dim buff As New Byte[4]
  Dim b As Byte
 
    aFl = Open "/tmp/mio_file" For Write
              
     Write #aFl, buff As Byte[]

    aFl.Close

End


...ma non comprendo perché, andando poi con un editor esadecimale a controllare il risultato all'interno del file, ottengo questo strano risultato:

41 02 04 00 00 00 00 66 66

Cioè sembra che ai primi tre byte venga attribuita una sorta di codice. Infatti ho notato che il 1° ed il 2° byte, pur variando il valore della dimensione nell'array Byte[n], non mutano; mentre il 3° byte varia con il variare nel valore posto come dimensione dell'array Byte[n].
Inoltre,  i quattro byte azzerati li ottengo solo dopo questa specie di codice formato dai primi 3 byte.

Perché accade questo ?  ???


P.S. Ho notato, invece, che quello strano risultato non accade se pongo l'array diversamente:
Codice: gambas [Seleziona]

buff[4] As Byte


Public Sub Button1_Click()

  Dim aFl As File
  Dim b As Byte
 
    aFl = Open "/tmp/mio_file" For Write
 
     Write #aFl, buff As Byte[]

    aFl.Close

End

In questo caso, invece, ottengo il vero risultato che volevo, ossia:
00 00 00 00 66 66 66 66 66
« Ultima modifica: 08 Ottobre 2014, 16:29:45 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: Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #1 il: 07 Aprile 2012, 20:42:50 »
Sembra ti abbia memorizzato il puntatore all'array, invece del suo contenuto.
Invece di usare "FOR EACH B...", prova ad usare un normale integer e poi azzeri il valore del singolo item dell'array, così:
Codice: [Seleziona]
DIM i AS Integer
FOR i = 0 TO buff.Max
  buff[i] = 0x00
NEXT

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.238
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #2 il: 07 Aprile 2012, 21:44:39 »
Invece di usare "FOR EACH B...", prova ad usare un normale integer e poi azzeri il valore del singolo item dell'array, così:

Allora, ho fatto:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

 Dim aFl As File
 Dim buff As New Byte[4]
 Dim i As Integer
 
    aFl = Open "/tmp/a" For Write  

   For i = 0 To buff.Max
     buff[i] = &00
   Next

   Write #aFl, buff As Byte[]  

  aFl.Close  

End


...niente... stesso risultato !  :hatecomputer:
« 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 Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #3 il: 08 Aprile 2012, 18:57:52 »
Per azzerare un dato di tipo byte, l'istruzione che conosco io è bDato=Cbyte(0). Quindi nel tuo caso sarebbe:
Codice: gambas [Seleziona]
For i = 0 To buff.Max  
    buff[i] = CByte(0)
  Next

 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.238
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #4 il: 08 Aprile 2012, 19:37:25 »
Per azzerare un dato di tipo byte, l'istruzione che conosco io è bDato=Cbyte(0).
...niente da fare.
« 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 Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #5 il: 08 Aprile 2012, 22:20:58 »
Puoi ancora provare ad azzerare i bit del singolo bute ad uno ad uno
Citazione
Es.: BClr(205, 4). il numero 205 ("11001101" in numerazione binaria) viene modificato in 197 ("11000101)".
Codice: gambas [Seleziona]
Dim ii As Integer
Dim bCrt As Byte
.............................................
    For i = 0 To buff.Max 
      for ii = 0 to 7
       buff[i] = BClr(buff[i] ,ii) 
      Next
     Next 

:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.238
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #6 il: 08 Aprile 2012, 23:03:35 »
Puoi ancora provare ad azzerare i bit del singolo bute ad uno ad uno

Ancora "acqua".
Il risultato finale, se ad esempio voglio azzerare i primi quattro byte del file, è ancora quello iniziale: 41 02 04, e quindi finalmente i quattro zero.

Resta ancora valida l'ipotesi di md9327 :
Sembra ti abbia memorizzato il puntatore all'array, invece del suo contenuto.
« 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 Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #7 il: 08 Aprile 2012, 23:27:53 »
Hai provato a portarti il contenuto dell'area di buffer in un'area tua, di modicare quello che vuoi e rstituirla, alla fine per la registrazione? Io farei la prova, anche per constatare che il risultato sia sempre quello che hai ottenuto fino ad ora, ma anche per accertare che sia veramente un problema di indirizzamento di G3.
Ricorda: in programmazione non lasciare mai niente di intentato, qualsiasi idea anche la più stupida in assoluto, può trasformarsi in unì'idea brillante e risolutiva. Per questo ti sto buttando addosso tutto quello che mi viene in mente.  ;D E poi, suggerire è molto più facile che eseguire (tradotto in siciliano sarebbe cumannari e megghiu di f...ere)  :rotfl:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.238
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #8 il: 08 Aprile 2012, 23:51:01 »
Hai provato a...
Da quel che mi sembra il problema sorge in fase di scrittura.: fino al Write i valori sono = 0, però poi nel file trovo la... sorpresina di Pasqua !  :-\
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.238
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #9 il: 09 Aprile 2012, 02:17:54 »
Va be'... ho coinvolto anche la ML di Minisini su 'sto problema. Lui me l'ha risolto, conservando l'array (che era la cosa che volevo appunto conservare), suggerendomi di usare il Metodo Write di Byte[], e non Write come istruzione:
« To write the contents of an array, use its Write method, not the Write instruction.
The Write instruction *serializes* the data by writing both datype
information and data, so that the Read instruction can read it back later.
»

Quest'ultima informazione viene confermata anche da un altro utente della Mailing List internazionale di Gambas, il quale mi dice:
« If you
  Write #File, aArr As Array
then Gambas has to be able to
  aArr = Read #File As Array
the data back. To do so, the type of array and its size must be available and thus are written before the actual data.
»


Ed allora il codice finale, giusto è:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim aFl As File  
  Dim buff As New Byte[4]

   aFl = Open "/tmp/mio_file" For Write

    buff.Write(aFl)

  aFl.Close

End


...ed ora come risultato nel file ottengo, coerentemente con quanto volevo, i primi quattro byte = 0 .

Altro esempio pratico dimostrativo:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim aFl As File  
  Dim buff As New Byte[4]
  Dim b as byte

   aFl = Open "/tmp/mio_file" For Write

' carichiamo nell'array 4 valori da 0 a 3:
   For b = 0 To 3
     buff[b] = b
   Next

' li andiamo a scrivere nel nostro file
' partendo sempre dal suo 1° byte:
    buff.Write(aFl)

  aFl.Close

End

...avremo coerentemente questo risultato: 00 01 02 03



P.S. Minisini ha precisato che i tre strani dati, che prima ottenevo nel file
41 02 04 00 00 00 00 ......
stanno a rappresentare:

41 è l'Array (il carattere 'A' sta appunto per Array).
02 significa Byte.
04 è (come ipotizzavo) il numero della dimensione dell'Array.

...quindi poi seguono i byte del contenuto dell'array.
« Ultima modifica: 11 Dicembre 2012, 11:07:10 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 Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: [RISOLTO] Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #10 il: 09 Aprile 2012, 09:49:52 »
Benissimo!
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.238
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Azzerando un gruppo di byte in un file mediante Byte[]
« Risposta #11 il: 27 Maggio 2017, 17:50:49 »
02 significa Byte.

Al riguardo vedere i "Gambas datatypes identifiers" presenti nel file sorgente ".../main/share/gambas.h" .
« 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. »