Pagina 1 di 1

Creazione di un buffer linguaggio C

Inviato: sab 14 apr 2012, 15:48
da potenzio
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);
}