Creazione di un buffer linguaggio C
Inviato: sab 14 apr 2012, 15:48
Salve a tutti, premetto che non ho molta esperienza nel programmare in C ( ho studiato un po' di C++ e Java); devo implementare un buffer per le operazioni di I/O a livello di bit, e non ho la piu' pallida idea di come fare, anche perche' mi e' stato chiesto di utilizzare per le operazioni di lettura e scrittura una maschera. Vi posto anche un po di codice che mi e' stato dato. Potete aiutarmi o darmi qualche spiegazione sul codice?? Grazie mille.
Codice: Seleziona tutto
#define BITBUF_SIZE 4096
// dimensione del buffer in bit
#define BITBUF_SIZE_IN_BITS (BITBUF_SIZE * 8)
typedef struct
{
int POS ;
int LEN;
int mode; // 0 = READ; 1 = WRITE
int FD;
u_int8_t BUF[BITBUF_SIZE];
}BITFILE;
BITFILE* bitfile_open(char* filename,int mode)
{
int fd;
BITFILE* p;
if(mode!=0 && mode !=1)
{
return NULL;
}
fd=open(filename,(mode==0?O_RDONLY:O_WRONLY),0644);
if(fd<0)
{
printf("fail \n");
return NULL;
}
p=calloc(1,sizeof(BITFILE));
if(p==NULL)
{
close(fd);
printf("fail");
return NULL;
}
p->FD=fd;
p->mode=mode;
return p;
}
int bitfile_read(BITFILE* bfp,u_int64_t* dst,int nbits)
{
return(0);
}
int bitfile_write(BITFILE* P,u_int64_t D,int LEN)
{
u_int8_t mask;
mask &=(u_int8_t)0;
int OFS,K,RES,LEN2;
LEN2=LEN;
while(LEN2>0)
{
OFS=P->POS/8;
K=P->POS%8;
RES=8-K;
if(LEN2<RES)
RES=LEN;
mask=(1<<RES)-1;
P->BUF[OFS]&=(1<<K)-1;
P->BUF[OFS]|=(D & mask)<<K;
LEN2=LEN2-RES;
P->POS+=RES;
D>>=RES;
if(P->POS >= BITBUF_SIZE_IN_BITS)
{
safe_write(P->FD,P->BUF,BITBUF_SIZE);
P->POS=0;
}
}
return LEN;
}
int bitfile_close(BITFILE* P)
{
int OFS,K;
OFS=P->POS/8;
K=P->POS%8;
safe_write(P->FD,P->BUF,OFS);
close(P->FD);
bzero(P,sizeof(BITFILE)); //Azzeramento prima della chiusura
free(P);
return(0);
}