2017-01-12 3 views
-1

Lassen Sie uns sagen, ich habe einen Puffer und ich brauche 6 Bits. Vier Bits von einem Element im Puffer und zwei Bits vom nächsten Element. Ich denke, ich weiß, wie man auf die richtigen Bits von jedem Element zugreift, aber ich bin nicht sicher, wie man die Bits kombiniert. Hier ist ein Beispielcode.Wie bit masking zu verwenden, um Zugriff auf sechs Bits aus Puffer

FILE * pFile; 
long lSize; 
unsigned char * buffer; 
//int16_t * buffer; 
size_t result; 

pFile = fopen ("TestFile.jpg" , "rb"); 
if (pFile==NULL) {fputs ("File error",stderr); exit (1);} 

// obtain file size: 
fseek (pFile , 0 , SEEK_END); 
lSize = ftell (pFile); 
//lSize = (ftell (pFile))/2; 
rewind (pFile); 

// allocate memory to contain the whole file: 
buffer = (unsigned char*) malloc (sizeof(unsigned char)*lSize); 
//buffer = (int16_t*) malloc (sizeof(int16_t)*lSize); 
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} 

// copy the file into the buffer: 
result = fread (buffer,1,lSize,pFile); 
//result = fread (buffer,2,lSize,pFile); 
if (result != lSize) {fputs ("Reading error",stderr); exit (3);} 

/* the whole file is now loaded in the memory buffer. */ 

// I think this should get the last four bits of this element (buffer[i] >> 4) & 0xF) 

// I think this should get the first two bits from the next element (buffer[i+1] & 0x3) 

if (32 == (((buffer[i] >> 4) & 0xF) & (buffer[i+1] & 0x3))){ 
/*Do something.*/ 
} 
+0

Welche 4 Bits haben Sie von dem ersten Byte benötigen , und welche 2 Bits benötigen Sie von der Sekunde? Danach, in welcher Reihenfolge sollten sie sich befinden, wenn sie verkettet werden müssen? –

+0

Danke für die Antwort. In diesem Beispiel die letzten vier im ersten Byte und die ersten zwei im zweiten. Dann kommt für die Verkettung das erste Byte zuerst. Also bekomme ich sechs weitere Bisse aus dem Puffer. – Kahless

+0

Also, für die zwei Bytes mit Bits: 'abcdefgh ijklmnop', wollen Sie ein einzelnes Byte, das die Bits hat:' 00efghij'? Ist das korrekt? – Makyen

Antwort

2

Ich bin nicht sicher, in welcher Reihenfolge Sie die Bits in, verbinden wollen, aber vielleicht wollen Sie so etwas wie dieses:

unsigned char lastFourBits = (buffer[i] >> 4) & 0xF;   // 0000xxxx 
unsigned char firstTwoBits = (buffer[i+1] & 0x3);   // 000000yy 
unsigned char combined = (lastFourBits << 2) | firstTwoBits; // 00xxxxyy 

oder alternativ:

unsigned char combined = (firstTwoBits << 4) | lastFourBits; // 00yyxxxx 
+0

@MikelF Ich stimme zu, aber ich verwende die gleiche Namenskonvention, die der Fragesteller in seinen Code-Kommentaren verwendet hat, um Verwirrung zu vermeiden. (Die Position, die durch "erstes Bit" vs. "letztes Bit" bezeichnet wird, ist etwas im Auge des Betrachters) –

+0

Es tut mir leid wegen der schlechten Wortwahl. Ich versuche sechs fortlaufende Bits aus zwei aufeinanderfolgenden Bytes zu bekommen. Dies ist nur so, dass ich Bitverschiebung und Maskierung verstehen kann. – Kahless

+0

Hey so das "|" Was verbindet die beiden Werte in diesem Beispiel, oder? – Kahless

1

Die Bitverschiebung Sie führen hier (buffer[i] >> 4) ist tatsächlich verlieren die 4 Bits, die Sie wollen. wird die niederwertigen vier Bits des ersten Bytes erfassen. Für das zweite Byte möchten Sie, dass die zwei Bits höherer Ordnung (buffer[i+1] & 0xC0) diese Bytes erfassen.

verketten:

value = ((buffer[i] & 0x0F) << 2) + ((buffer[i+1] & 0xC0) >> 6);

Ein Beispiel: Wenn der Datenstrom 0xabcd ist, oder 1010 1011 1100 1101 Diese Gleichung nimmt 101111.

+0

Awesome Dank für das hinweisend. – Kahless

Verwandte Themen