# Scrittura su file modalitÃ  binaria

**URL:** <https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386>\
**Category:** IT\
**Created:** [January 27, 2010, 11:25am UTC](https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386 "2010-01-27T11:25:44Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![sircotra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@sircotra](https://www.ruby-forum.com/u/sircotra)\
**Post date:** [January 27, 2010, 11:25am UTC](https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386/1 "2010-01-27T11:25:44Z")

</div>

Ciao a tutti,  
ho da poco scoperto il modno di ruby e devo capire ancora molte cose.  
Ad esempio una di queste riguarda la scrittura a file.  
Dopo opportune elaborazioni ottengo una stringa di bit lunga un bel  
pÃ²…  
Per salvare la stringa su file ho usato:

output = File.open(ARGV[1], “wb”)  
output.write(varbit)

il risultato Ã¨ un file che contiene la stringa di bit ma immenso perchÃ¨  
ogni bit Ã¨ scritto come carattere quindi se ho 10000 bit, ottengo 10000  
caratteri cioÃ¨ un file grande 10KB mentre volevo ottenere un file di  
1250 caratteri quindi 1.2KB circa…  
In pratica la scrittura raggruppata a 8 bit alla volta cioÃ¨ un carattere  
ASCII,  
es:  
101001010101010110010101001010111101001

ottengo:  
101001010101010110010101001010111101001  
ma scritta come: 000000001 + 00000000 + 000000001 + …  
cioÃ¨ ‘1’+‘0’+‘1’…  
mentre vorrei: 10100101 + 01010101 + …  
cioÃ¨: ‘Â¥’ + ‘U’ + …  
nel file  
Come si fa?!

Grazie

Fabio

---

<div class="post-metadata">

**Author:** ![sircotra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@sircotra](https://www.ruby-forum.com/u/sircotra)\
**Post date:** [January 27, 2010, 12:00pm UTC](https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386/2 "2010-01-27T12:00:11Z")

</div>

Vedi Array#pack

Il 27 gennaio 2010 11.25, Fabio – [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

> il risultato è un file che contiene la stringa di bit ma immenso perchè  
> ogni bit è scritto come carattere quindi se ho 10000 bit, ottengo 10000  
> cioè ‘1’+‘0’+‘1’…
> 
> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
Carlo P.  
email: removed\_email\_address@domain.invalid  
twitter: @carlopecchia

---

<div class="post-metadata">

**Author:** ![sircotra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@sircotra](https://www.ruby-forum.com/u/sircotra)\
**Post date:** [January 27, 2010, 12:00pm UTC](https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386/3 "2010-01-27T12:00:11Z")

</div>

On Wednesday 27 January 2010 11:25:44 Fabio – wrote:

> Dopo opportune elaborazioni ottengo una stringa di bit lunga un bel  
> pò…  
> […]  
> Come si fa?!

Prova a dare un’occhiata a Array#pack ed a String#unpack:

- [class Array - RDoc Documentation](http://www.ruby-doc.org/core/classes/Array.html#M002222)
- [class String - RDoc Documentation](http://www.ruby-doc.org/core/classes/String.html#M000760)

Ciao  
Flavio

---

<div class="post-metadata">

**Author:** ![sircotra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@sircotra](https://www.ruby-forum.com/u/sircotra)\
**Post date:** [January 27, 2010, 12:13pm UTC](https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386/4 "2010-01-27T12:13:04Z")

</div>

2010/1/27 Fabio – [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Ciao a tutti,  
> ho da poco scoperto il modno di ruby e devo capire ancora molte cose.  
> Ad esempio una di queste riguarda la scrittura a file.  
> Dopo opportune elaborazioni ottengo una stringa di bit lunga un bel  
> pò…  
> Per salvare la stringa su file ho usato:
> 
> output = File.open(ARGV[1], “wb”)  
> output.write(varbit)

hai frainteso: la modalità binaria di scrittura e lettura dei file è  
una cosa diversa che ha a che fare con il fatto che i sistemi  
operativio differiscono nel modo in cui trattano i file se sono testo  
o “binari”. Quindi se scrivi un file di test è ok ‘w’ sennò meglio  
‘wb’ (ma mi pare che ruby lo faccia in automatico ormai? Non ricordo).

Non mi è ben chiaro cosa devi fare ma dovresti applicare al contrario  
la procedura che hai usato per creare la string “01110” (le classi  
numeric mi pare abbiano una cosa del genere) per ottenere un oggetto  
(e.g. un carattere o un numero) e poi scrivere quello. O meglio,  
evitare la prima e la seconda operazione e passare direttamente da  
input binario, manipolazione, scrittura.

---

<div class="post-metadata">

**Author:** ![sircotra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@sircotra](https://www.ruby-forum.com/u/sircotra)\
**Post date:** [January 27, 2010, 3:12pm UTC](https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386/5 "2010-01-27T15:12:46Z")

</div>

2010/1/27 Fabio – [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Vorrei che scrivesse gli equivalenti dei caratteri formati dai  
> raggruppamenti di 8 bit alla volta: ad esempio se ottengo la stringa di  
> bit 01000000, nel file mi viene scritto: “01000000” ma si tratta di 8  
> caratteri cioÃ¨ 8 byte giusto? (‘0’=00000000, ‘1’=00000001, ecc…).  
> Io vorrei ottenere “a” (valore in ascii di 01000000) cioÃ¨ 1 byte, ok?!

si, ma non capisco perchÃ© hai bisogno dei bit in una stringa

Ma ti dicevo: se hai ottenuto la string in un modo puoi applicare  
l’Ã¬operazione inversa. Esempio, se hai usato Numebr#to\_s(base) e  
String#to\_i(base), e ?carattere e Number#chr

> > ?a.to\_s(2)  
> > =\> “1100001”  
> > ?a.to\_s(2).to\_i(2).chr  
> > =\> “a”

> Ecco… non riesco a capire perchÃ¨ non lo fa in automatico e non riesco  
> a trovare niente che lo faccia…

ti avevano suggerito array pack e unpack che penso funzionino, sennÃ²  
vedi sopra. Il motivo per cui non lo fa in automatico Ã¨ che tu gli  
stai dicendo di scrivere una lista di caratteri. Dovrebbe poterti  
leggere nel pensiero per poter capire che tu quella stringa di  
caratteri ascii vuoi che sia interpretata come una stringa di bit :).

Come ti dicevo, il “binary” mode Ã¨ un’altra cosa, significa solo che  
su windows quando scrivi  
file.puts(“ciao\nmiao”)  
nel file di output c’Ã¨ la stringa “ciao” seguita da un carattere di  
new line mentre se apri il file in modalitÃ non binaria nel file di  
output avrai “ciao” seguito da un carriage return e poi da un newline.

---

<div class="post-metadata">

**Author:** ![sircotra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@sircotra](https://www.ruby-forum.com/u/sircotra)\
**Post date:** [January 27, 2010, 12:35pm UTC](https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386/6 "2010-01-27T12:35:07Z")

</div>

> hai frainteso: la modalitï¿½ binaria di scrittura e lettura dei file ï¿½  
> una cosa diversa che ha a che fare con il fatto che i sistemi  
> operativio differiscono nel modo in cui trattano i file se sono testo  
> o “binari”. Quindi se scrivi un file di test ï¿½ ok ‘w’ sennï¿½ meglio  
> ‘wb’ (ma mi pare che ruby lo faccia in automatico ormai? Non ricordo).

> Non mi ï¿½ ben chiaro cosa devi fare ma dovresti applicare al contrario  
> la procedura che hai usato per creare la string “01110” (le classi  
> numeric mi pare abbiano una cosa del genere) per ottenere un oggetto  
> (e.g. un carattere o un numero) e poi scrivere quello. O meglio,  
> evitare la prima e la seconda operazione e passare direttamente da  
> input binario, manipolazione, scrittura.

Brevemente, una volta ottenuta la stringa di bit, vorrei memorizzarla su  
file, che alla fine sarebbe un file di testo, ma NON con scritto tutti 0  
o 1.  
Vorrei che scrivesse gli equivalenti dei caratteri formati dai  
raggruppamenti di 8 bit alla volta: ad esempio se ottengo la stringa di  
bit 01000000, nel file mi viene scritto: “01000000” ma si tratta di 8  
caratteri cioÃ¨ 8 byte giusto? (‘0’=00000000, ‘1’=00000001, ecc…).  
Io vorrei ottenere “a” (valore in ascii di 01000000) cioÃ¨ 1 byte, ok?!

Ecco… non riesco a capire perchÃ¨ non lo fa in automatico e non riesco  
a trovare niente che lo faccia…

---

<div class="post-metadata">

**Author:** ![sircotra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@sircotra](https://www.ruby-forum.com/u/sircotra)\
**Post date:** [January 27, 2010, 3:13pm UTC](https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386/7 "2010-01-27T15:13:39Z")

</div>

In generale (questo vale per tutti i linguaggi) scrivere un file in  
binario non vuol dire che Ruby ti converta stringhe di zeri e uni in  
byte mentre scrive i dati nel file. Vuol dire che la stringa viene  
scritta cosÃ¬ com’Ã¨ senza eventuali conversioni che il sistema operativo  
applica ai file di testo (ce ne sono alcuni che ne fanno).

Quindi devi prima convertire la tua stringa in una sequenza di byte e  
poi scriverla.

[“01000001”].pack(“B8”) ritorna “A”

[“01000001”, “01000010”].pack(“B8B8”) ritorna “AB”

pack Ã¨ un metodo di Array e quindi per prima cosa dovrai spezzare la tua  
stringa in blocchi di 8 caratteri e metterli in un array per cui  
converrÃ produrre direttamente quello anzichÃ© la stringa.

Paolo

> Brevemente, una volta ottenuta la stringa di bit, vorrei memorizzarla su  
> file, che alla fine sarebbe un file di testo, ma NON con scritto tutti 0  
> o 1.  
> Vorrei che scrivesse gli equivalenti dei caratteri formati dai  
> raggruppamenti di 8 bit alla volta: ad esempio se ottengo la stringa di  
> bit 01000000, nel file mi viene scritto: “01000000” ma si tratta di 8  
> caratteri cioÃ¨ 8 byte giusto? (‘0’=00000000, ‘1’=00000001, ecc…).  
> Io vorrei ottenere “a” (valore in ascii di 01000000) cioÃ¨ 1 byte, ok?!
> 
> Ecco… non riesco a capire perchÃ¨ non lo fa in automatico e non riesco  
> a trovare niente che lo faccia…

---

<div class="post-metadata">

**Author:** ![sircotra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@sircotra](https://www.ruby-forum.com/u/sircotra)\
**Post date:** [January 27, 2010, 3:25pm UTC](https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386/8 "2010-01-27T15:25:39Z")

</div>

2010/1/27 Paolo M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> In generale (questo vale per tutti i linguaggi) scrivere un file in  
> binario non vuol dire che Ruby ti converta stringhe di zeri e uni in  
> byte mentre scrive i dati nel file. Vuol dire che la stringa viene  
> scritta così com’è senza eventuali conversioni che il sistema operativo  
> applica ai file di testo (ce ne sono alcuni che ne fanno).

a riguardo, ci fu una volta un thread su ruby lang, che è molto  
interssante perché si tende a pensare sia scemo windows, ma la cosa è  
molto più antica  
[http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/265722](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/265722)

---

<div class="post-metadata">

**Author:** ![sircotra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f475e1/32.png) [@sircotra](https://www.ruby-forum.com/u/sircotra)\
**Post date:** [January 27, 2010, 8:46pm UTC](https://www.ruby-forum.com/t/scrittura-su-file-modalita-binaria/182386/9 "2010-01-27T20:46:29Z")

</div>

gabriele renzi wrote:

> 2010/1/27 Fabio – [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > Vorrei che scrivesse gli equivalenti dei caratteri formati dai  
> > raggruppamenti di 8 bit alla volta: ad esempio se ottengo la stringa di  
> > bit 01000000, nel file mi viene scritto: “01000000” ma si tratta di 8  
> > caratteri cioÃ¨ 8 byte giusto? (‘0’=00000000, ‘1’=00000001, ecc…).  
> > Io vorrei ottenere “a” (valore in ascii di 01000000) cioÃ¨ 1 byte, ok?!
> 
> si, ma non capisco perchÃ© hai bisogno dei bit in una stringa
> 
> Ma ti dicevo: se hai ottenuto la string in un modo puoi applicare  
> l’Ã¬operazione inversa. Esempio, se hai usato Numebr#to\_s(base) e  
> String#to\_i(base), e ?carattere e Number#chr
> 
> > > ?a.to\_s(2)  
> > > =\> “1100001”  
> > > ?a.to\_s(2).to\_i(2).chr  
> > > =\> “a”
> 
> > Ecco… non riesco a capire perchÃ¨ non lo fa in automatico e non riesco  
> > a trovare niente che lo faccia…
> 
> ti avevano suggerito array pack e unpack che penso funzionino, sennÃ²  
> vedi sopra. Il motivo per cui non lo fa in automatico Ã¨ che tu gli  
> stai dicendo di scrivere una lista di caratteri. Dovrebbe poterti  
> leggere nel pensiero per poter capire che tu quella stringa di  
> caratteri ascii vuoi che sia interpretata come una stringa di bit :).
> 
> Come ti dicevo, il “binary” mode Ã¨ un’altra cosa, significa solo che  
> su windows quando scrivi  
> file.puts(“ciao\nmiao”)  
> nel file di output c’Ã¨ la stringa “ciao” seguita da un carattere di  
> new line mentre se apri il file in modalitÃ non binaria nel file di  
> output avrai “ciao” seguito da un carriage return e poi da un newline.

Hai perfettamente ragione, quindi, mi spiego meglio.  
Si tratta di un compressore (huffman).  
Leggo in input un file di testo ed ottengo in uscita la sua versione  
compressa.  
Per com’Ã¨ costruito ottengo una stringa lunghissima di bit ed un albero  
delle decisioni.  
Il problema Ã¨ che se vado a salvare la stringa su file (essendo scritta  
in caratteri ‘1’ e ‘0’) il file Ã¨ piÃ¹ grosso dell’originale e quindi  
sembra che non abbia compresso una mazza! In realtÃ se i bit fossero  
raggruppati e scritti come caratteri occuperebbero 1/8 dello spazio e la  
dimensione tornerebbe…  
es:  
fileinput.txt 182 KB  
fileoutput.hfm 799 KB (???) no dovrebbe essere 799/8 → 99 KB OK!!!

Spero di aver chiarito il tuo dubbio…

Grazie a tutti per le risposte.

Fabio
