/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
[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/ '
)-------------------------------------------------------------------(

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408846
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste