Creazione di un buffer linguaggio C

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
potenzio
Linux 0.x
Linux 0.x
Messaggi: 1
Iscritto il: sab 14 apr 2012, 15:33

Creazione di un buffer linguaggio C

Messaggio 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);
}

Rispondi