Italian [B4J] Lettura sequenziale file binario

MARCO C.

Active Member
Licensed User
Ciao a tutti,
avrei la necessita di leggere un file e step di x byte ( es. 10 byte ) ... ma mi sto perdendo con del codice di esempio che ho trovato nel forum.. tra ReadBytes .. InputStream etc. etc .

Il file in questione è abbastanza piccolo e dovrei leggere il suo contenuto e volta x volta inserirlo in un vettore stringa.
Potere aiutarmi ?
Grazie in anticipo
 

MARCO C.

Active Member
Licensed User
Del tuo codice ovviamente ho preso solo la sezione di letture e non quella di scrittura su file .
Purtroppo , il file che devo leggere non è regolare a blocchi identici , ma per leggere il suo contenuto devo scartare i primi 20 byte e poi a blocchi di 76

dalla Sub Read2 lancio spezzetta dove indico i blocchi di 76 ... però all'interno di spezzata leggo prima i 20 byte che NON mi interessano ...

Da quello che vedi ... dovrebbe essere cosi ? ( non mi quadra tantisssssimo :( )

Grazie

B4X:
Sub READ2
   
    Spezzetta( stubPath, stubName,76)
   
End Sub



Sub Spezzetta(Dir As String, FileName As String, Spezzoni As Int)
    Dim FileSize As Long = File.Size(Dir, FileName)
    'Dim Spezzoni As Int = 10
    Dim Spezzone As Int = FileSize / Spezzoni
    Dim Resto As Int = FileSize Mod Spezzone
    Dim strBuffer As String
    Log("File size: " & FileSize)
    Log("Spezzone " & Spezzone)
    Log("Resto: " & Resto)

    Dim rasInput As RandomAccessFile
    rasInput.Initialize(Dir, FileName, True)
    Dim FileNum As Int

    Dim Buffer(20) As Byte
    rasInput.ReadBytes(Buffer, 0, 20,  0)
    strBuffer = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
       
    Log("[start]" & strBuffer)

    FileNum = 2
    For i = 0 To Spezzoni * Spezzone - 1 Step Spezzone
        Dim Buffer(Spezzone) As Byte
        rasInput.ReadBytes(Buffer,  0, Spezzone,  i)
               
        strBuffer = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
       
        Log("[" & FileNum & "]" & strBuffer)

        FileNum = FileNum + 1
       
    Next

   
End Sub
 
Last edited:

drgottjr

Expert
Licensed User
Longtime User
leggere un file "al taglio" non e' difficile (ad es, con randomaccessfile).
ma un problema succede (o potrebbe succedere) quando si tratta di convertire un grupino di bytes (10 a la volta) ad una stringa utf8. 10 bytes non representano per forza 10 caratteri in utf8. in epoche
anteriori, 1 byte era 1 carattere. oggi, 1, 2, fino 3 bytes potrebbero
essere un solo carattere. ad es, bytes 8 e 9 di una stringa di 10 bytes
potrebbero fare parte di la prossima stringa... per tanto, questa
stringa e fottuta cosi' come quella che seque.
 

LucaMs

Expert
Licensed User
Longtime User
Da quello che vedi ... dovrebbe essere cosi ?
Mah. In effetti il mio codice, di oltre 3 anni fa e che, come al solito, non serviva a me 😄 :confused:) aveva una logica diversa, nel senso che si conosceva apriori il numero di "pezzi" da prelevare.

Purtroppo , il file che devo leggere non è regolare a blocchi identici , ma per leggere il suo contenuto devo scartare i primi 20 byte e poi a blocchi di 76
Ma poi i blocchi sono tutti di 76 byte? Se fosse così sarebbe facile. Inoltre, il file dovrebbe avere lunghezza 20 + 76 * N.
Magari provo qualcosa con B4J (si fa prima), ma non avendo il file... va beh.
 

LucaMs

Expert
Licensed User
Longtime User
Ho buttato giù un progettino-ino-ino, con un file di testo "fasullo" (quindi non fare caso ai log).

Copia il tuo file nella cartella "Shared Files" (così sarà disponibile per B4A, B4J e B4i). Poi, per importarlo nel tuo progetto B4A, fai CTRL+CLICK su:

1699473990229.png


Nota che ciò che ha scritto @drgottjr è giusto, nel senso che se è un file di testo, la cosa si complica non poco.
 

LucaMs

Expert
Licensed User
Longtime User
Spiego meglio, anche se è una cosa che si fa sempre con i progetti B4XPages.

Ci sono tre cartelle, una per ogni "linguaggio":
B4A
B4i
B4J

Aprirete ed userete quello che vi serve, no?!

Poi c'è la cartella:
SharedFiles (file condivisi)
in cui mettere tutti i file "accessori", ad esempio i file immagine. Per non doverli copiare a mano nelle varie \B4A\Files, \B4i\Files e \B4J\Files (considerate anche che col tempo potreste modificali), nella B4XMainPage del vostro progetto avete queste righe:
B4X:
#Region Shared Files
#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files"
'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True
#End Region
Posizionando il cursore del mouse sulla penultima riga (prima di #End Region) e facendo click (ovviamente tasto sinistro del mouse), i file verranno copiati automaticamente dalla "Shared Files" alla vostra .........\Files.
 
Top