|
| [c++]Håndtering af bit.... Fra : holst |
Dato : 12-03-02 01:22 |
|
Hej NG
Jeg er ved at se om jeg kan lave mit egen filkomprimeringsprogram, og har
derfor brug for at kunne skrive den komprimerede data ned på en fil. Data'en
laver jeg udfra f.eks. en ukomprimeret tekstfil, og hvert tegn i filen er
repræsenteret ved hjælp af en række bit af tilfældig længde. F.eks. 11110
eller 110. Mit problem er så; hvordan kan jeg skrive enkelte bit (1 eller 0)
ned i en fil, og er det overhovedet noget c++ understøtter?? og hvordan
sætter jeg bits'ene i forlængelse af hinanden??
Håber nogen kan/vil hjælpe...på forhånd tak
mvh. Allan Eriksen
| |
Eivind Midtgård (12-03-2002)
| Kommentar Fra : Eivind Midtgård |
Dato : 12-03-02 08:23 |
|
"holst" <holst@nork.auc.dk> wrote in message
news:a6jh2s$6re$1@sunsite.dk...
> Jeg er ved at se om jeg kan lave mit egen filkomprimeringsprogram, og
har
> derfor brug for at kunne skrive den komprimerede data ned på en fil.
Data'en
> laver jeg udfra f.eks. en ukomprimeret tekstfil, og hvert tegn i filen
er
> repræsenteret ved hjælp af en række bit af tilfældig længde. F.eks.
11110
> eller 110. Mit problem er så; hvordan kan jeg skrive enkelte bit (1
eller 0)
> ned i en fil, og er det overhovedet noget c++ understøtter?? og
hvordan
> sætter jeg bits'ene i forlængelse af hinanden??
Du kan ikke skrive enkelte bit ned i en fil. Du må pakke dem i char, som
er den minste enhet du kan skrive til fil.
Denne koden pakker 0xF og 0xA i en char.
char c1 = 0xF;
char c2 = 0xA;
char c3 = (c1 << 4) & c2;
c3 inneholder nå 0xFA.
Du trenger bitshift-operatorene << og >>, og bit-boolske & | ~.
Eivind
| |
holst (12-03-2002)
| Kommentar Fra : holst |
Dato : 12-03-02 09:24 |
|
Tak for svaret, men den løsning er desværre ikke helt god, da det er vigtigt
at jeg kan skrive enkelte bit. Mit spørgsmål er så om det er muligt at
sammensætte enkelte bit til en char? F.eks:
0
10
0
1110
=01001110=0x4E
Eller findes der virkelig ikke strings af bit i c++??
mvh. Allan Eriksen
"Eivind Midtgård" <eivindmi@frisurf.no> wrote in message
news:a6kaje$f5r35$1@ID-72976.news.dfncis.de...
>
> "holst" <holst@nork.auc.dk> wrote in message
> news:a6jh2s$6re$1@sunsite.dk...
> > Jeg er ved at se om jeg kan lave mit egen filkomprimeringsprogram, og
> har
> > derfor brug for at kunne skrive den komprimerede data ned på en fil.
> Data'en
> > laver jeg udfra f.eks. en ukomprimeret tekstfil, og hvert tegn i filen
> er
> > repræsenteret ved hjælp af en række bit af tilfældig længde. F.eks.
> 11110
> > eller 110. Mit problem er så; hvordan kan jeg skrive enkelte bit (1
> eller 0)
> > ned i en fil, og er det overhovedet noget c++ understøtter?? og
> hvordan
> > sætter jeg bits'ene i forlængelse af hinanden??
>
> Du kan ikke skrive enkelte bit ned i en fil. Du må pakke dem i char, som
> er den minste enhet du kan skrive til fil.
>
> Denne koden pakker 0xF og 0xA i en char.
>
> char c1 = 0xF;
> char c2 = 0xA;
> char c3 = (c1 << 4) & c2;
>
> c3 inneholder nå 0xFA.
>
> Du trenger bitshift-operatorene << og >>, og bit-boolske & | ~.
>
> Eivind
>
>
| |
Sturla Molden (12-03-2002)
| Kommentar Fra : Sturla Molden |
Dato : 12-03-02 11:58 |
|
On Tue, 12 Mar 2002 09:23:50 +0100, "holst" <holst@nork.auc.dk> wrote:
>Tak for svaret, men den løsning er desværre ikke helt god, da det er vigtigt
>at jeg kan skrive enkelte bit. Mit spørgsmål er så om det er muligt at
>sammensætte enkelte bit til en char? F.eks:
>
>0
>10
>0
>1110
>=01001110=0x4E
>
>Eller findes der virkelig ikke strings af bit i c++??
Du kan bruke "bitfield", men det enkleste er å skrive 8 bits av gangen
(en unsigned char). Bruk << og || operatorene, og start med en "1" og
en "0". Det vil si;
unsigned char a, b;
a = 0;
b = 1;
For å sette 7-ende bit til 1 skriver du
a = (b << 1) || a;
For å sette første bit i a til 1 skriver du
a = (b << 7) || a;
Når a ser ut slik du vil, skriver du den til en fil. Om du skriver
hver bit for seg eller 8 bits samlet i en byte spiller ingen rolle. Du
risikerer maskimalt å bruke 7 bits av lagringsplass for mye med denne
teknikken.
Den andre teknikken går ut på å bruke bitfield
typedef unsigned char uchar
struct BitField
{
uchar b1 : 1; // 1 bit
uchar b2 : 1;
uchar b3 : 1;
uchar b4 : 1;
uchar b5 : 1;
uchar b6 : 1;
uchar b7 : 1;
uchar b8 : 1;
}
Nå kan du skrive
BitField mbb;
mbb.b1 = 1; mbb.b2 = 0; // etc
Og deretter skrive mbb til en fil. Fortsatt er det lurt å bruke N x 8
bits om gangen, siden operativsystemet neppe håndterer en struct
med størrelse på 7 eller 15 bits som 7 eller 15 bits. Du må altså
skrive bytes, men du kan likevel kontrollere hver eneste bit.
Sturla Molden
| |
Thomas Lykkeberg (20-03-2002)
| Kommentar Fra : Thomas Lykkeberg |
Dato : 20-03-02 23:00 |
|
On Tue, 12 Mar 2002 10:57:44 GMT, sturla@slett.molden.net.invalid
(Sturla Molden) wrote:
>
>For å sette 7-ende bit til 1 skriver du
>
>a = (b << 1) || a;
>
>
>For å sette første bit i a til 1 skriver du
>
>a = (b << 7) || a;
>
a = (b << 1) || a;
a bliver da TRUE (>1 eller blot 1)
Der menes vist a = (b << 1) | a
/Thomas
| |
Thomas Lykkeberg (20-03-2002)
| Kommentar Fra : Thomas Lykkeberg |
Dato : 20-03-02 22:58 |
|
On Tue, 12 Mar 2002 08:22:50 +0100, "Eivind Midtgård"
<eivindmi@frisurf.no> wrote:
>
>Du kan ikke skrive enkelte bit ned i en fil. Du må pakke dem i char, som
>er den minste enhet du kan skrive til fil.
>
>Denne koden pakker 0xF og 0xA i en char.
>
>char c1 = 0xF;
>char c2 = 0xA;
>char c3 = (c1 << 4) & c2;
>
>c3 inneholder nå 0xFA.
Hej Eivind.. Ikke helt.
0xF0 & 0x0A = 0x00
Sorry, men du mente vist OR (|)
/Thomas
| |
Eivind Midtgård (21-03-2002)
| Kommentar Fra : Eivind Midtgård |
Dato : 21-03-02 07:55 |
|
"Thomas Lykkeberg" <thomasDOTlykkeberg@privatDOTdk> wrote in message
news:gd1i9uo14fkocg4jc1l1v4qmbknjnaklnt@4ax.com...
> On Tue, 12 Mar 2002 08:22:50 +0100, "Eivind Midtgård"
> >
> >c3 inneholder nå 0xFA.
> Hej Eivind.. Ikke helt.
>
> 0xF0 & 0x0A = 0x00
>
> Sorry, men du mente vist OR (|)
Du har rett!
Eivind
| |
Hans Oluf Hagen (12-03-2002)
| Kommentar Fra : Hans Oluf Hagen |
Dato : 12-03-02 10:59 |
|
> Tak for svaret, men den løsning er desværre ikke helt god, da
> det er vigtigt at jeg kan skrive enkelte bit. Mit spørgsmål er
> så om det er muligt at sammensætte enkelte bit til en char?
> F.eks:
>
> 0
> 10
> 0
> 1110
> =01001110=0x4E
Du må sette sammen bitene til en char ved å bruke
bitwise operasjoner.
En char er på de fleste systemer en byte = 8 bit, men det most
significant bit er signbit. Derfor "bør" du bruke unsigned char
som datatype.
For å slippe å bruke disse operasjonene hele tiden, kan du jo
lage en klasse, som gjør dette for deg...
--
H.O.H
| |
Thomas Lykkeberg (20-03-2002)
| Kommentar Fra : Thomas Lykkeberg |
Dato : 20-03-02 22:57 |
|
On Tue, 12 Mar 2002 01:21:32 +0100, "holst" <holst@nork.auc.dk> wrote:
>Hej NG
>
>Jeg er ved at se om jeg kan lave mit egen filkomprimeringsprogram, og har
>derfor brug for at kunne skrive den komprimerede data ned på en fil. Data'en
>laver jeg udfra f.eks. en ukomprimeret tekstfil, og hvert tegn i filen er
>repræsenteret ved hjælp af en række bit af tilfældig længde. F.eks. 11110
>eller 110. Mit problem er så; hvordan kan jeg skrive enkelte bit (1 eller 0)
>ned i en fil, og er det overhovedet noget c++ understøtter?? og hvordan
>sætter jeg bits'ene i forlængelse af hinanden??
>
>Håber nogen kan/vil hjælpe...på forhånd tak
>
>mvh. Allan Eriksen
>
Hej Allan
Det kan løses ved at lave et lille interface "ned" til din fil som kan
skrive een bit ad gangen.
Følgende kunne laves:
void StoreBit(unsigned char bit)
{
static unsigned char byte = 0;
static char bitNumber = 0;
byte << 1;
byte |= (unsigned char)((bit >= 1) ? 1:0);
bitNumber++;
if(bitNumber > 7)
{
AppendByteToFile(byte);
bitNumber = 0;
byte = 0;
}
}
Med lidt C++ overloading af = eller << operatoren kan kan du lave det
rigtig fikst. Funktionen "AppendByteToFile()" er bare en funktion som
skriver den i funktionen overførte byte.
Læsning af bits fra en fil kan løses på lignende måde.
/Thomas
| |
Markus B. Krüger (21-03-2002)
| Kommentar Fra : Markus B. Krüger |
Dato : 21-03-02 09:45 |
|
Thomas Lykkeberg <thomasDOTlykkeberg@privatDOTdk> writes:
> byte << 1;
> byte |= (unsigned char)((bit >= 1) ? 1:0);
Liten trykkleif: dette skulle vel vært
byte <<= 1;
byte |= (unsigned char)((bit >= 1) ? 1:0);
Hvis en kan forutsette at bit alltid er enten 0 eller 1, kan koden
forenkles til
byte = byte << 1 | bit;
--
,------------------- Markus Bjartveit Krüger ---------------------.
' `
` E-mail: markusk@pvv.org WWW: http://www.pvv.org/~markusk/ '
)-------------------------------------------------------------------(
| |
|
|