Repository 32bit  Forum
Repository 64bit  Wiki

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.

Creazione di un buffer linguaggio C

Messaggioda potenzio » sab apr 14, 2012 14: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);
}
potenzio
Linux 1.0
Linux 1.0
 
Messaggi: 1
Iscritto il: sab apr 14, 2012 14:33

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti