2016-11-03 1 views
-4

J'ai un long flux de bits et un pointeur vide au début de celui-ci. A partir de ce flux binaire, je veux extraire 'n' bits de la position de bit 'm'. Par exemple, je veux extraire 75 bits à partir de la position du 57ème bit. Comment faire ça?Extraction de bits spécifiques d'un flux binaire, étant donné un pointeur vide sur le début du flux binaire

J'ai essayé de le faire en typant le pointeur vide dans un pointeur char puis l'incrémenter jusqu'à m/8. A partir de maintenant, je n'ai aucune idée de comment extraire d'ici.

Comment travailler avec de tels bitstreams dans C? Pardonnez-moi car je n'ai écrit aucun code ici concernant l'approche parce que je ne sais pas comment procéder et il n'y a pas de meilleur endroit pour le comprendre qu'ici.

+2

Bienvenue dans Stack overflow! Ce n'est pas un service d'écriture de code, vous devez dire ce que vous avez fait jusqu'à présent, le problème auquel vous faites face et des exemples de données. http://stackoverflow.com/help/how-to-ask –

+0

Voici une question sur l'accès à des bits spécifiques via un pointeur char. Il ne répond pas à votre question, mais il peut vous donner une idée sur la façon de procéder. http://stackoverflow.com/questions/7607224/how-do-you-reset-a-bit-value-in-a-string –

Répondre

0

Voici une solution simple et non optimisée pour extraire d'un tableau d'octets les EXTRACT_COUNT bits (ici = 75) commençant à EXTRACT_OFFSET (ici = 57).

Le getBit() renvoie (-1) lorsque le bitIndex demandé pointe sur le bitArray[], sinon il renvoie la valeur du bit extrait.

#include <stdio.h> 

int getBit(unsigned char bitArray[], int lenArray,int bitIndex) 
{ 
    int iBytePos = bitIndex >> 3; 
    int iByteBit = bitIndex % 8; 
    unsigned char uByteVal; 

    if (iBytePos > lenArray) { 
     return (-1); 
    } 
    uByteVal = bitArray[ iBytePos ]; 
    if (iByteBit==0) printf("."); // to mark the 8bits border 
    if ((uByteVal & (0x80 >> iByteBit)) != 0) { 
     return (1); 
    } 
    return (0); 
} 

#define ARRAY_SIZE (18) 
#define EXTRACT_OFFSET (57) 
#define EXTRACT_COUNT (75) 

int main() 
{ 
    unsigned char tabByte[ARRAY_SIZE] = { 
     0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xFF, 
     0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x00 }; 

    int iVal,iCount; 

    iCount=0; 
    for(int i=0;i<EXTRACT_COUNT;i++) 
    { 
     iVal = getBit(tabByte,ARRAY_SIZE,i+EXTRACT_OFFSET); 
     if (iVal >= 0) { 
      iCount++; 
      printf("%1d",iVal); 
     } 
    } 
    printf("\niCount=%d\n",iCount); 
    return (0); 
}