64 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "bitfields.h"
 | |
| 
 | |
| /// Takes a pointer, offset bitcount and data bitcount, returning the unsigned int read from the givens.
 | |
| /// offsetBits may be > 7, in which case offsetBits / 8 is added to the pointer automatically.
 | |
| /// This function assumes Most Significant Bits first.
 | |
| /// If dataBits > 64, only the last 64 bits are returned.
 | |
| unsigned long long Bit::getMSB(char * pointer, unsigned int offsetBits, unsigned int dataBits){
 | |
|   //If the offset is a whole byte or more, add the whole bytes to the pointer instead.
 | |
|   pointer += offsetBits >> 3;
 | |
|   //The offset is now guaranteed less than a whole byte.
 | |
|   offsetBits &= 0x07;
 | |
|   unsigned long long retVal = 0;
 | |
|   //Now we parse the remaining bytes
 | |
|   while (dataBits){
 | |
|     //Calculate how many bits we're reading from this byte
 | |
|     //We assume all except for the offset
 | |
|     unsigned int curBits = 8 - offsetBits;
 | |
|     //If that is too much, we use the remainder instead
 | |
|     if (curBits > dataBits){
 | |
|       curBits = dataBits;
 | |
|     }
 | |
|     //First, shift the current return value by the amount of bits we're adding
 | |
|     retVal <<= curBits;
 | |
|     //Next, add those bits from the current pointer position at the correct offset, increasing the pointer by one
 | |
|     retVal |= ((int)(*(pointer++)) << offsetBits) >> (8 - curBits);
 | |
|     //Finally, set the offset to zero and remove curBits from dataBits.
 | |
|     offsetBits = 0;
 | |
|     dataBits -= curBits;
 | |
|   }//Loop until we run out of dataBits, then return the result
 | |
|   return retVal;
 | |
| }
 | |
| 
 | |
| /// Takes a pointer, offset bitcount and data bitcount, setting to given value.
 | |
| /// offsetBits may be > 7, in which case offsetBits / 8 is added to the pointer automatically.
 | |
| /// This function assumes Most Significant Bits first.
 | |
| /// WARNING: UNFINISHED. DO NOT USE.
 | |
| /// \todo Finish writing this - untested atm.
 | |
| void Bit::setMSB(char * pointer, unsigned int offsetBits, unsigned int dataBits, unsigned long long value){
 | |
|   //Set the pointer to the last byte we need to be setting
 | |
|   pointer += (offsetBits + dataBits) >> 3;
 | |
|   //The offset is now guaranteed less than a whole byte.
 | |
|   offsetBits = (offsetBits + dataBits) & 0x07;
 | |
|   unsigned long long retVal = 0;
 | |
|   //Now we set the remaining bytes
 | |
|   while (dataBits){
 | |
|     //Calculate how many bits we're setting in this byte
 | |
|     //We assume all that will fit in the current byte
 | |
|     unsigned int curBits = offsetBits;
 | |
|     //If that is too much, we use the remainder instead
 | |
|     if (curBits > dataBits){
 | |
|       curBits = dataBits;
 | |
|     }
 | |
|     //Set the current pointer position at the correct offset, increasing the pointer by one
 | |
|     retVal |= ((int)(*(pointer++)) << offsetBits) >> (8 - curBits);
 | |
|     *pointer = (((*pointer) << offsetBits) >> offsetBits) | ((value & 0xFF) << (8 - offsetBits));
 | |
|     --pointer;
 | |
|     //Finally, shift the current value by the amount of bits we're adding
 | |
|     value >>= offsetBits;
 | |
|     //... and set the offset to eight and remove curBits from dataBits.
 | |
|     offsetBits = 8;
 | |
|     dataBits -= curBits;
 | |
|   }//Loop until we run out of dataBits, then return the result
 | |
| }
 | |
| 
 | 
