Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C]: Gestione i/o di bit su file e gestione di bit

    Vorrei sapere come si può leggere/scrivere su un file singoli bit e gestirli con un'applicazione C.

    E un quesito strano, ma sto provando la compressione di Huffman ...
    printf("Programmazione in C!");
    cout<<"Programmazione in C++!";

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non puoi.
    Il minimo che si può scrivere su file è un byte. Quindi devi gestirti i bit impacchettandoli in un byte con i bit operator.

  3. #3
    Leggere/scrivere singoli bit è impossibile, mentre è possibile leggere/scrivere singoli byte (tramite fgetc e fputc).
    ---EDIT---
    Anticipato..
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Quindi non posso eseguire operazioni di input/output sul file di singoli bit...

    Tuttavia posso scomporre i byte letti in bit o assemblare bit in byte per scriverli?
    printf("Programmazione in C!");
    cout<<"Programmazione in C++!";

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    1) No

    2) Sì

  6. #6
    Come?
    printf("Programmazione in C!");
    cout<<"Programmazione in C++!";

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Dalle risposte precedenti :

    "... è possibile leggere/scrivere singoli byte (tramite fgetc e fputc). ..."

    "... Quindi devi gestirti i bit impacchettandoli in un byte con i bit operator ..."

    Puoi utilizzare gli operatori a bit

    &

    |

    ^

  8. #8
    Sicome non li ho mai usati mi faresti un esempio di come posso comporre un byte utilizzando otto bit con questi operatori?

    Inoltre mi chiedo se i bit fossero più dei byte? (ad esempio 8byte + 3bit) come faccio a non perderli? (Logicamente l'algoritmo di Huffman è un metodo di compressione loseless)
    printf("Programmazione in C!");
    cout<<"Programmazione in C++!";

  9. #9
    http://www.cs.cf.ac.uk/Dave/C/node13.html
    Si può anche fare con un mix di strutture e union "particolari":
    codice:
    struct byteBF
    {
        unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
    }
    union byte_u
    {
        struct byteBF bBF;
        unsigned char byte;
    }
    /*...*/
    union byte_u bu;
    bu.byte=0;
    bu.bBF.bit0=1;
    bu.bBF.bit1=1;
    bu.bBF.bit2=0;
    /*...*/
    fputc(bu.byte,stream);
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    codice:
    unsigned char b = 0;
    
    // Set bit 4
    b |= (1 << 4);
    printf("%02X\n", b);
    
    // Set bit 7
    b |= (1 << 7);
    printf("%02X\n", b);
    	
    // Clear bit 4
    b &= ~(1 << 4);
    printf("%02X\n", b);
    
    // Set bit 2
    b |= (1 << 2);
    printf("%02X\n", b);
    	
    // Clear bit 7
    b &= ~(1 << 7);
    printf("%02X\n", b);
    Non puoi utilizzare 8 byte e 3 bit ... devi utilizzare 9 byte ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.