Newsgroup: it.comp.os.linux.development
Titolo: Bit or not to bit!

Buongiorno a tutti.
Esiste un modo di scrivere su disco un singolo bit alla volta?
Mi spiego meglio, se avessi bisogno di scrivere un byte alla volta (char per
esempio) dovrei fare:
fwrite( &c, sizeof(char),1,fp);
Ma se avessi bisogno di scrivere 2 bit solamente?
Lo sò che è una domanda un pò strana, ma a me servirebbe questo. :-)
Grazie a tutti
Ciao
Paolo



Alla faccia del problema irrisolvibile :-D
Beh al di sotto del byte non si scende ... l'unica cosa che puoi fare e'
scrivere byte e ignorare i bit che non ti danno informazione ...

 Ma se avessi bisogno di scrivere 2 bit solamente?
No. Anzi, per la verita' e' impossibile anche scrivere un byte alla volta,
ma solo blocchi interi (la cui dimensione solitamente e' un multiplo di 512
byte). Non per niente si chiamano periferiche "a blocchi" :-)
Alessandro.

 scrivere byte e ignorare i bit che non ti danno informazione ...
Ma come faccio?
Ti spiego meglio, mettiamo che io voglia rappresentare un carattere (per es.
A che č uguale a 11000001) con 01, e cosě per alcuni caratteri, in modo tale
che la sequenza ABC ad es. non sia composta da 24 bit ma solamente da 6.
ES:
- A = 01
- B = 11
- C = 10
ABC = 011110
6 bit contro 24. Una buona compressione! :-)
E' possibile farlo?
Grazie
Ciao
Paolo

 Alessandro.
Ma ne sei veramente sicuro?!?!?
fwrite( &c, sizeof(char),1,fp);
Non scrive un solo char (1 byte)???
Ciao
Paolo

 E' possibile farlo?
Basta usare una codifica di "fine sequenza" (nell'esempio potresti usare 00)
o specificare a parte (magari in testa alla sequenza) il numero dei bit
significativi.
Alessandro.

 Paolo
Ciao
Matic

 E' possibile farlo?
Ecco .. allora il tuo problema non e' la scrittura di bit in un file, ma
"impacchettamento dei bit in un byte" ... problema ben diverso ...
per fare tutto cio', basta che usi gli operatori logico-aritmetici AND, OR
e NOT, che in C si chiamano & (AND), | (OR), ~ (NOT), e quelli di shift a
destra e sinistra << (shift left) e >> (shift right).
Butto giu' due righe, anche se non proprio precise, per rendere l'idea ...
int a = 1;
int b = 3;
int c = 2;
int p = (a << 4) | (b << 2) | c;
in p e' contenuto il valore 00011110, che e' quello da te richiesto.
Addirittura esistono anche le strutture fatte da campi di bit, che possono
esserti utili ... ricorda pero' che e' possibile scrivere solo byte nei
file.
Consulta il tuo manuale o documentazione. Troverai tutto quello che ti
serve.

 Non scrive un solo char (1 byte)???
No, simula.
In realta' il sistema riscrive l'intero blocco (riempito di zeri o altro,
non importa) ed aggiunge uno al campo che contiene la lunghezza del file.
Alessandro.

 Matic
OK penso di aver capito! :-)
Grazie ci proverň e ti farň sapere
Grazie a tutti
Paolo


Vedi anche "man stat"
Alessandro.

 Paolo
Se ti può essere utile tempo fa ho scritto una classe (beh classettina
^__^) in C++ che affronta più o meno questo problema. Si chiama
BitString e la puoi trovare sul mio sito:
http://nem01.altervista.org/Codice.html
Come dice il nome, bitstring fornisce una stringa sulla quale puoi
leggere e scrivere un singolo bit alla volta.
-- 
The more crap you put up with, the more crap you are going to get. 
 |\ |       |HomePage   : 
http://nem01.altervista.org
 | \|emesis |XPN (my nr): 
http://xpn.altervista.org

 leggere e scrivere un singolo bit alla volta.
STL fornisce come specializzazione/depravazione vector<bool> ;)
Faccio notare che nemmeno il C, "considerato" più a basso livello del
C++, fornisce tanta roba per operare a livello di bit se non gli
operatori binari.
Si possono definire il numero di bit per alcuni tipi interi, ficcarli
in una struct ma non so nemmeno se viene garantito qualche cosa sugli
allignment.
Non solo Linux è multi piattaforma, fwrite non sa nulla sul fatto che
stia scrivendo su un dispositivo a blocchi, una scheda perforata o una
flash. Di mezzo c'è il buffer del C, il buffer dell'OS, il buffer
degli HD (se sono HD...).
I processori "moderni" con superpipelined/whatever con diversi livelli
di cache quasi sempre fetchano ben più di un byte... se non si sa
esattamente cosa si stà facendo meglio affidarsi all'OS, al
compilatore e al processore e lavorare per int con del codice pulito.

 leggere e scrivere un singolo bit alla volta.
Mai visto std::bitset?
-- 
Andrea Bergia - studente              Linux Registered User #281550

 Mai visto std::bitset?
Evidentemente no :-D
Cmq a suo tempo fu un esercizio interessante :-)
-- 
Is there a lawyer in the house? BLAM! Is there another? 
