Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Scrivere Stringa in un file binario

    Ciao a tutti. Ho un piccolo problema..... ho un file binario da dover importare ed esportare! Allora import lo faccio senza problemi utilizzando la classe FileInputStream e leggendo di volta in volta un tipo differente in base a quello che e' salvato nel file!
    Per esempio ho una data (2009) che in formato Hex e' 00 00 07 D9 perche' e' codificata come un intero!
    Quando pero' devo scrivere lo stesso valore nel file... qui mi scontro con alcuni problemi!
    perche' nn riesco a tradurre la stringa nel giusto valore binario da scrive nel file!
    Per scrivere il file utilizzo naturalmente il FileOutputStream pero' siccome ho piu' dati da scrivere, invece di scrivere direttamente il valore intero nel file, lo aggiungo in uno stringbuffer e poi lo scrivo... ma nn riesco a far riportare nel file il giusto valore!!! Qualcuno potrebbe dirmi dove sbaglio!!!!! GRAZIE!!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Scrivere Stringa in un file binario

    Originariamente inviato da rocklife
    Ciao a tutti. Ho un piccolo problema..... ho un file binario da dover importare ed esportare!
    Parli di file "binario". Quindi di un formato ben preciso. Quale? Lo hai definito tu o qualcun'altro? O è uno standard/noto?

    Se vuoi trattare file binari, serve solo OutputStream (o sottoclassi) oppure RandomAccessFile (se si avesse bisogno di accesso "casuale").

    Parli di valori interi, insomma, tipi di dato composti da più byte. Nel file come sono memorizzati? In Little-Endian o Big-Endian? I valori interi li devi scrivere in "binario", non centrano nulla String o StringBuffer. Hai un int? Spezzalo in 4 byte (con apposite operazioni di shift/and) e scrivi i 4 byte oppure, se il formato è Big-Endian, usa DataOutputStream.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: Scrivere Stringa in un file binario

    Originariamente inviato da andbin
    Parli di file "binario". Quindi di un formato ben preciso. Quale? Lo hai definito tu o qualcun'altro? O è uno standard/noto?

    Se vuoi trattare file binari, serve solo OutputStream (o sottoclassi) oppure RandomAccessFile (se si avesse bisogno di accesso "casuale").

    Parli di valori interi, insomma, tipi di dato composti da più byte. Nel file come sono memorizzati? In Little-Endian o Big-Endian? I valori interi li devi scrivere in "binario", non centrano nulla String o StringBuffer. Hai un int? Spezzalo in 4 byte (con apposite operazioni di shift/and) e scrivi i 4 byte oppure, se il formato è Big-Endian, usa DataOutputStream.
    Da premettere che ho un po' di confusione su questo cose.....
    Il file e' binario ma a dire la verita' non capisco cosa vuoi dire quando parli di formato!In ogni caso il formato non l'ho definito io ma e' stato definito da altri.

    Ho un intero da scrivere come faccio a spezzarlo in 4 byte e poi scriverlo anche perche' credo che nel file venga utilizzata la codifica little-Endian!

    In ogni caso.... siccome non posso scrivere subito sul file, perche' una volta definito il contenuto del file, lo devo rielaborare perche' mi serve calcolare il crc che va come header del file, ho deciso di utilizzare uno string buffer in modo da avere in una struttura dati tutto il body del file, poterlo elaborare e poi scriverlo!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Scrivere Stringa in un file binario

    Originariamente inviato da rocklife
    Il file e' binario ma a dire la verita' non capisco cosa vuoi dire quando parli di formato!In ogni caso il formato non l'ho definito io ma e' stato definito da altri.
    E quale è??? Devi saperlo! Esempio: un file .class di Java è un file binario, inizia con 4 byte di "marcatura" fissi, poi 2 byte che formato un unsigned-16bit per la versione "minor", poi 2 byte che formato un unsigned-16bit per la versione "major", ecc...
    Quale è il formato del tuo file, in generale?

    Originariamente inviato da rocklife
    Ho un intero da scrivere come faccio a spezzarlo in 4 byte e poi scriverlo anche perche' credo che nel file venga utilizzata la codifica little-Endian!
    codice:
    int val = 2009;
    
    fos.write(val);
    fos.write(val >>> 8);
    fos.write(val >>> 16);
    fos.write(val >>> 24);
    Se si volesse scrivere un int in Little-Endian su un file.

    Originariamente inviato da rocklife
    In ogni caso.... siccome non posso scrivere subito sul file, perche' una volta definito il contenuto del file, lo devo rielaborare perche' mi serve calcolare il crc che va come header del file, ho deciso di utilizzare uno string buffer
    Se devi trattare byte, StringBuffer è del tutto inutile.
    Se devi scrivere prima un qualcosa che puoi calcolare solo dopo hai 2 strade: usi RandomAccessFile, così puoi andare avanti/indietro come ti pare, oppure "bufferizzi" tutto in memoria ma come ripeto, non con StringBuffer. Sai a priori la quantità di byte? Istanzia un array byte[]. Non la sai o vuoi scrivere con write() o altro? Usa ByteArrayOutputStream (alla fine ottieni un byte[]).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5

    Re: Re: Re: Re: Scrivere Stringa in un file binario

    Originariamente inviato da andbin
    E quale è??? Devi saperlo! Esempio: un file .class di Java è un file binario, inizia con 4 byte di "marcatura" fissi, poi 2 byte che formato un unsigned-16bit per la versione "minor", poi 2 byte che formato un unsigned-16bit per la versione "major", ecc...
    Quale è il formato del tuo file, in generale?

    codice:
    int val = 2009;
    
    fos.write(val);
    fos.write(val >>> 8);
    fos.write(val >>> 16);
    fos.write(val >>> 24);
    Se si volesse scrivere un int in Little-Endian su un file.

    Se devi trattare byte, StringBuffer è del tutto inutile.
    Se devi scrivere prima un qualcosa che puoi calcolare solo dopo hai 2 strade: usi RandomAccessFile, così puoi andare avanti/indietro come ti pare, oppure "bufferizzi" tutto in memoria ma come ripeto, non con StringBuffer. Sai a priori la quantità di byte? Istanzia un array byte[]. Non la sai o vuoi scrivere con write() o altro? Usa ByteArrayOutputStream (alla fine ottieni un byte[]).

    Allora la codifica la conosco.... so' come e' formato il file e so' per esempio la data 2009 deve essere tradotto in 4 byte e cosi via.... Utilizzando il codice che mi hai postato ottengo in formato esadecimale:

    D9 07 00 00

    invece io dovrei ottenere

    00 00 07 D9

    quindi la codifica non e' little-endian?e per tradurre per esempio i byte, gli short e i long quali metodi devo utilizzare???
    Quindi lo string buffer e' inutile ok.... devo utilizzare per forza un ByteArrayOutputStream perche' non so' a priori la grandezza del file!!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Re: Re: Scrivere Stringa in un file binario

    Originariamente inviato da rocklife
    invece io dovrei ottenere

    00 00 07 D9

    quindi la codifica non e' little-endian?
    E allora è Big-Endian, non Little-Endian! (ma sai cosa vogliono dire??).
    I write() sarebbero da "rovesciare".

    Originariamente inviato da rocklife
    e per tradurre per esempio i byte, gli short e i long quali metodi devo utilizzare???
    Se sono tutti in Big-Endian, puoi usare DataOutputStream, già fatto appositamente per scrivere tipi primitivi in un formato "indipendente" dalla piattaforma (ed è stato scelto appunto Big-Endian).

    Altrimenti servono i soliti operatori di shift, and, eventualmente dei cast a byte ... dipende se devi assegnare ad una variabile byte, o passare a un write() ecc....

    Originariamente inviato da rocklife
    devo utilizzare per forza un ByteArrayOutputStream perche' non so' a priori la grandezza del file!!
    Se scegli di usare DataOutputStream (e non conversioni fai-da-te), metti il ByteArrayOutputStream "sotto" il DataOutputStream e scrivi su quest'ultimo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Grazie mille per i preziosi consigli con i quali sono riuscito a risolvere tutti i miei problemi di generazione dei file!!! GRAZIE MILLE!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.