39 #include <arpa/inet.h>
53 #define _copysign copysign
56 using namespace SLNet;
67 data = (
unsigned char* ) stackData;
82 data = (
unsigned char* ) stackData;
88 numberOfBitsAllocated = initialBytesToAllocate << 3;
99 numberOfBitsUsed = lengthInBytes << 3;
101 copyData = _copyData;
102 numberOfBitsAllocated = lengthInBytes << 3;
106 if ( lengthInBytes > 0 )
110 data = (
unsigned char* ) stackData;
120 memcpy( data, _data, (
size_t) lengthInBytes );
126 data = (
unsigned char* ) _data;
135 numberOfBitsAllocated = lengthInBits;
150 if ( numberOfBitsUsed > 0 )
157 numberOfBitsUsed = 0;
170 if (numberOfBytes==0)
174 if ((numberOfBitsUsed & 7) == 0)
177 memcpy(data+
BITS_TO_BYTES(numberOfBitsUsed), inputByteArray, (
size_t) numberOfBytes);
182 WriteBits( (
unsigned char* ) inputByteArray, numberOfBytes * 8,
true );
198 if ((bitStream->
GetReadOffset()&7)==0 && (numberOfBitsUsed&7)==0)
201 int numBytes=numberOfBits/8;
202 memcpy(data + (numberOfBitsUsed >> 3), bitStream->
GetData()+readOffsetBytes, numBytes);
208 while (numberOfBits-->0)
210 numberOfBitsMod8 = numberOfBitsUsed & 7;
211 if ( numberOfBitsMod8 == 0 )
214 if (bitStream->data[ bitStream->readOffset >> 3 ] & ( 0x80 >> ( bitStream->readOffset & 7 ) ) )
217 data[ numberOfBitsUsed >> 3 ] = 0x80;
222 data[ numberOfBitsUsed >> 3 ] = 0;
229 if (bitStream->data[ bitStream->readOffset >> 3 ] & ( 0x80 >> ( bitStream->readOffset & 7 ) ) )
230 data[ numberOfBitsUsed >> 3 ] |= 0x80 >> ( numberOfBitsMod8 );
234 bitStream->readOffset++;
240 Write(&bitStream, numberOfBits);
250 bitStream->
Write(
this, numberOfBits);
255 bitStream->
Write(
this);
262 bitStream.
Write(
this, numberOfBits);
267 bitStream.
Write(
this);
275 if ((readOffset & 7) == 0)
281 memcpy( outByteArray, data + ( readOffset >> 3 ), (
size_t) numberOfBytes );
283 readOffset += numberOfBytes << 3;
288 return ReadBits( (
unsigned char* ) outByteArray, numberOfBytes * 8 );
301 numberOfBitsUsed = 0;
310 if ( ( numberOfBitsUsed & 7 ) == 0 )
311 data[ numberOfBitsUsed >> 3 ] = 0;
321 BitSize_t numberOfBitsMod8 = numberOfBitsUsed & 7;
323 if ( numberOfBitsMod8 == 0 )
324 data[ numberOfBitsUsed >> 3 ] = 0x80;
326 data[ numberOfBitsUsed >> 3 ] |= 0x80 >> ( numberOfBitsMod8 );
338 bool result = ( data[ readOffset >> 3 ] & ( 0x80 >> ( readOffset & 7 ) ) ) !=0;
349 Write((
const char*) inByteArray, numberOfBytesToWrite);
361 if (inByteArray==0 || inputLength==0)
367 WriteAlignedBytes((
const unsigned char*) inByteArray, inputLength < maxBytesToWrite ? inputLength : maxBytesToWrite);
379 if ( numberOfBytesToRead <= 0 )
389 memcpy( inOutByteArray, data + ( readOffset >> 3 ), (
size_t) numberOfBytesToRead );
391 readOffset += numberOfBytesToRead << 3;
397 return ReadAlignedBytesSafe(inOutByteArray,(
unsigned int&) inputLength,(
unsigned int)maxBytesToRead);
403 if (inputLength > maxBytesToRead)
404 inputLength=maxBytesToRead;
419 if (inputLength > maxBytesToRead)
420 inputLength=maxBytesToRead;
435 const BitSize_t numberOfBitsUsedMod8 = numberOfBitsUsed & 7;
438 if (numberOfBitsUsedMod8==0 && (numberOfBitsToWrite&7)==0)
440 memcpy( data + ( numberOfBitsUsed >> 3 ), inByteArray, numberOfBitsToWrite>>3);
441 numberOfBitsUsed+=numberOfBitsToWrite;
445 unsigned char dataByte;
446 const unsigned char* inputPtr=inByteArray;
449 while ( numberOfBitsToWrite > 0 )
452 dataByte = *( inputPtr++ );
454 if ( numberOfBitsToWrite < 8 && rightAlignedBits )
455 dataByte <<= 8 - numberOfBitsToWrite;
458 if ( numberOfBitsUsedMod8 == 0 )
459 * ( data + ( numberOfBitsUsed >> 3 ) ) = dataByte;
463 *( data + ( numberOfBitsUsed >> 3 ) ) |= dataByte >> ( numberOfBitsUsedMod8 );
465 if ( 8 - ( numberOfBitsUsedMod8 ) < 8 && 8 - ( numberOfBitsUsedMod8 ) < numberOfBitsToWrite )
467 *( data + ( numberOfBitsUsed >> 3 ) + 1 ) = (
unsigned char) ( dataByte << ( 8 - ( numberOfBitsUsedMod8 ) ) );
471 if ( numberOfBitsToWrite >= 8 )
473 numberOfBitsUsed += 8;
474 numberOfBitsToWrite -= 8;
478 numberOfBitsUsed += numberOfBitsToWrite;
479 numberOfBitsToWrite=0;
494 const unsigned int size,
const bool unsignedData )
496 BitSize_t currentByte = ( size >> 3 ) - 1;
498 unsigned char byteMatch;
512 while ( currentByte > 0 )
514 if ( inByteArray[ currentByte ] == byteMatch )
525 WriteBits( inByteArray, ( currentByte + 1 ) << 3,
true );
536 if ( ( unsignedData && ( ( *( inByteArray + currentByte ) ) & 0xF0 ) == 0x00 ) ||
537 ( unsignedData ==
false && ( ( *( inByteArray + currentByte ) ) & 0xF0 ) == 0xF0 ) )
541 WriteBits( inByteArray + currentByte, 4,
true );
548 WriteBits( inByteArray + currentByte, 8,
true );
560 if (numberOfBitsToRead<=0)
567 const BitSize_t readOffsetMod8 = readOffset & 7;
570 if (readOffsetMod8==0 && (numberOfBitsToRead&7)==0)
572 memcpy( inOutByteArray, data + ( readOffset >> 3 ), numberOfBitsToRead>>3);
573 readOffset+=numberOfBitsToRead;
581 memset( inOutByteArray, 0, (
size_t)
BITS_TO_BYTES( numberOfBitsToRead ) );
583 while ( numberOfBitsToRead > 0 )
585 *( inOutByteArray + offset ) |= *( data + ( readOffset >> 3 ) ) << ( readOffsetMod8 );
587 if ( readOffsetMod8 > 0 && numberOfBitsToRead > 8 - ( readOffsetMod8 ) )
588 *( inOutByteArray + offset ) |= *( data + ( readOffset >> 3 ) + 1 ) >> ( 8 - ( readOffsetMod8 ) );
590 if (numberOfBitsToRead>=8)
592 numberOfBitsToRead -= 8;
598 int neg = (int) numberOfBitsToRead - 8;
603 if ( alignBitsToRight )
604 * ( inOutByteArray + offset ) >>= -neg;
606 readOffset += 8 + neg;
613 numberOfBitsToRead=0;
622 const unsigned int size,
const bool unsignedData )
624 unsigned int currentByte = ( size >> 3 ) - 1;
627 unsigned char byteMatch, halfByteMatch;
638 halfByteMatch = 0xF0;
643 while ( currentByte > 0 )
649 if (
Read( b ) == false )
654 inOutByteArray[ currentByte ] = byteMatch;
661 if (
ReadBits( inOutByteArray, ( currentByte + 1 ) << 3 ) == false )
671 if ( readOffset + 1 > numberOfBitsUsed )
676 if (
Read( b ) == false )
682 if (
ReadBits( inOutByteArray + currentByte, 4 ) == false )
685 inOutByteArray[ currentByte ] |= halfByteMatch;
689 if (
ReadBits( inOutByteArray + currentByte, 8 ) == false )
699 BitSize_t newNumberOfBitsAllocated = numberOfBitsToWrite + numberOfBitsUsed;
701 if ( numberOfBitsToWrite + numberOfBitsUsed > 0 && ( ( numberOfBitsAllocated - 1 ) >> 3 ) < ( ( newNumberOfBitsAllocated - 1 ) >> 3 ) )
712 newNumberOfBitsAllocated = ( numberOfBitsToWrite + numberOfBitsUsed ) * 2;
713 if (newNumberOfBitsAllocated - ( numberOfBitsToWrite + numberOfBitsUsed ) > 1048576 )
714 newNumberOfBitsAllocated = numberOfBitsToWrite + numberOfBitsUsed + 1048576;
719 if (data==(
unsigned char*)stackData)
727 memcpy ((
void *)data, (
void *)stackData, (
size_t)
BITS_TO_BYTES( numberOfBitsAllocated ));
741 if ( newNumberOfBitsAllocated > numberOfBitsAllocated )
742 numberOfBitsAllocated = newNumberOfBitsAllocated;
746 return numberOfBitsAllocated;
755 memset(data+
BITS_TO_BYTES(numberOfBitsUsed), 0, (
size_t) numToWrite);
792 y = x >> 4;
if (y != 0) {n = n - 4; x = y;}
793 y = x >> 2;
if (y != 0) {n = n - 2; x = y;}
794 y = x >> 1;
if (y != 0)
return n - 2;
804 y = x >> 8;
if (y != 0) {n = n - 8; x = y;}
805 y = x >> 4;
if (y != 0) {n = n - 4; x = y;}
806 y = x >> 2;
if (y != 0) {n = n - 2; x = y;}
807 y = x >> 1;
if (y != 0)
return n - 2;
817 y = x >>16;
if (y != 0) {n = n -16; x = y;}
818 y = x >> 8;
if (y != 0) {n = n - 8; x = y;}
819 y = x >> 4;
if (y != 0) {n = n - 4; x = y;}
820 y = x >> 2;
if (y != 0) {n = n - 2; x = y;}
821 y = x >> 1;
if (y != 0)
return n - 2;
831 y = x >>32;
if (y != 0) {n = n -32; x = y;}
832 y = x >>16;
if (y != 0) {n = n -16; x = y;}
833 y = x >> 8;
if (y != 0) {n = n - 8; x = y;}
834 y = x >> 4;
if (y != 0) {n = n - 4; x = y;}
835 y = x >> 2;
if (y != 0) {n = n - 2; x = y;}
836 y = x >> 1;
if (y != 0)
return n - 2;
843 RakAssert( readOffset == numberOfBitsUsed );
848 if (numberOfBitsUsed <= 0)
850 #pragma warning(push)
851 #pragma warning(disable:4996)
852 strcpy(out,
"No bits\n");
857 unsigned int strIndex = 0;
862 if (counter == (numberOfBitsUsed - 1) >> 3)
863 stop = 8 - (((numberOfBitsUsed - 1) & 7) + 1);
867 for (
BitSize_t counter2 = 7; counter2 >= stop; counter2--)
869 if ((data[counter] >> counter2) & 1)
870 out[strIndex++] =
'1';
872 out[strIndex++] =
'0';
878 out[strIndex++] =
' ';
881 out[strIndex++] =
'\n';
888 if ( numberOfBitsUsed <= 0 )
890 strcpy_s(out, outLength,
"No bits\n" );
894 unsigned int strIndex=0;
899 if ( counter == ( numberOfBitsUsed - 1 ) >> 3 )
900 stop = 8 - ( ( ( numberOfBitsUsed - 1 ) & 7 ) + 1 );
904 for (
BitSize_t counter2 = 7; counter2 >= stop; counter2-- )
906 if ( ( data[ counter ] >> counter2 ) & 1 )
918 out[strIndex++]=
'\n';
934 sprintf_s(out+i*3, outLength-i*3,
"%02x ", data[i]);
943 #pragma warning(push)
944 #pragma warning(disable:4996)
945 sprintf(out + i * 3,
"%02x ", data[i]);
966 memcpy( *_data, data,
sizeof(
unsigned char) * (
size_t) (
BITS_TO_BYTES( numberOfBitsUsed ) ) );
967 return numberOfBitsUsed;
973 readOffset += numberOfBits;
985 numberOfBitsUsed = offset;
1034 if ( copyData ==
false )
1038 if ( numberOfBitsAllocated > 0 )
1046 memcpy( newdata, data, (
size_t)
BITS_TO_BYTES( numberOfBitsAllocated ) );
1061 static unsigned long htonlValue = htonl(12345);
1062 return htonlValue == 12345;
1068 inOutByteArray[i]=inByteArray[length-i-1];
1074 for (i=0; i < (length>>1); i++)
1076 temp = inOutData[i];
1077 inOutData[i]=inOutData[length-i-1];
1078 inOutData[length-i-1]=temp;
1094 data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];
1095 numberOfBitsUsed+=1*8;
1103 inOutByteArray[0] = data[( readOffset >> 3 ) + 0];
1111 #ifndef __BITSTREAM_NATIVE_END
1114 data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[1];
1115 data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[0];
1120 data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];
1121 data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[1];
1124 numberOfBitsUsed+=2*8;
1131 #ifndef __BITSTREAM_NATIVE_END
1134 inOutByteArray[0] = data[( readOffset >> 3 ) + 1];
1135 inOutByteArray[1] = data[( readOffset >> 3 ) + 0];
1140 inOutByteArray[0] = data[( readOffset >> 3 ) + 0];
1141 inOutByteArray[1] = data[( readOffset >> 3 ) + 1];
1151 #ifndef __BITSTREAM_NATIVE_END
1154 data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[3];
1155 data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[2];
1156 data[( numberOfBitsUsed >> 3 ) + 2] = inByteArray[1];
1157 data[( numberOfBitsUsed >> 3 ) + 3] = inByteArray[0];
1162 data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];
1163 data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[1];
1164 data[( numberOfBitsUsed >> 3 ) + 2] = inByteArray[2];
1165 data[( numberOfBitsUsed >> 3 ) + 3] = inByteArray[3];
1168 numberOfBitsUsed+=4*8;
1175 #ifndef __BITSTREAM_NATIVE_END
1178 inOutByteArray[0] = data[( readOffset >> 3 ) + 3];
1179 inOutByteArray[1] = data[( readOffset >> 3 ) + 2];
1180 inOutByteArray[2] = data[( readOffset >> 3 ) + 1];
1181 inOutByteArray[3] = data[( readOffset >> 3 ) + 0];
1186 inOutByteArray[0] = data[( readOffset >> 3 ) + 0];
1187 inOutByteArray[1] = data[( readOffset >> 3 ) + 1];
1188 inOutByteArray[2] = data[( readOffset >> 3 ) + 2];
1189 inOutByteArray[3] = data[( readOffset >> 3 ) + 3];
1197 unsigned short percentile;
1198 if (
Read(percentile))
1201 outFloat = floatMin + ((float) percentile / 65535.0f) * (floatMax-floatMin);
1202 if (outFloat<floatMin)
1204 else if (outFloat>floatMax)
1212 if (writeToBitstream)
1215 return ReadFloat16(inOutFloat, floatMin, floatMax);
1221 if (inOutFloat>floatMax+.001)
1225 if (inOutFloat<floatMin-.001)
1229 float percentile=65535.0f * (inOutFloat-floatMin)/(floatMax-floatMin);
1232 if (percentile>65535.0f)
1233 percentile=65535.0f;
1234 Write((
unsigned short)percentile);