1
1
#include " bitstream.h"
2
+
3
+ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
4
+ #define NBITSTREAM__LITTLE_ENDIAN_CPU
5
+ #endif
6
+
2
7
namespace NBitStream {
3
8
4
- union TMix {
5
- unsigned long long ull = 0 ;
6
- uint8_t bytes[8 ];
9
+ union UBytes {
10
+ uint32_t ui = 0 ;
11
+ uint8_t bytes[4 ];
7
12
};
8
13
9
14
TBitStream::TBitStream (const char * buf, int size)
10
15
: Buf(buf, buf+size)
11
16
{}
17
+
12
18
TBitStream::TBitStream ()
13
19
{}
14
- void TBitStream::Write (unsigned long long val, int n) {
15
- if (n > 23 || n < 0 )
16
- abort ();
17
- const int bitsLeft = Buf.size () * 8 - BitsUsed;
18
- const int bitsReq = n - bitsLeft;
19
- const int bytesPos = BitsUsed / 8 ;
20
- const int overlap = BitsUsed % 8 ;
21
-
22
- if (overlap || bitsReq >= 0 ) {
23
- Buf.resize (Buf.size () + (bitsReq / 8 + (overlap ? 2 : 1 )), 0 );
24
- }
25
- TMix t;
26
- t.ull = val;
27
- t.ull = (t.ull << (64 - n) >> overlap);
28
20
29
- for (int i = 0 ; i < n/8 + (overlap ? 2 : 1 ); ++i) {
30
- Buf[bytesPos+i] |= t.bytes [7 -i];
31
-
32
- // std::cout << "bufPos: "<< bytesPos+i << " buf: " << (int)Buf[bytesPos+i] << std::endl;
33
- }
34
-
35
- BitsUsed += n;
36
- }
37
- /*
38
- void TBitStream::Write(unsigned long long val, int n) {
21
+ void TBitStream::Write (uint32_t val, int n) {
39
22
if (n > 23 || n < 0 )
40
23
abort ();
41
24
const int bitsLeft = Buf.size () * 8 - BitsUsed;
@@ -46,25 +29,38 @@ void TBitStream::Write(unsigned long long val, int n) {
46
29
if (overlap || bitsReq >= 0 ) {
47
30
Buf.resize (Buf.size () + (bitsReq / 8 + (overlap ? 2 : 1 )), 0 );
48
31
}
49
- TMix t;
50
- t.ull = (val << (64 - n)) >> overlap;
51
- *(unsigned long long*)&Buf[bytesPos-8] |= t.ull;
32
+ UBytes t;
33
+ t.ui = (val << (32 - n) >> overlap);
34
+
35
+ for (int i = 0 ; i < n/8 + (overlap ? 2 : 1 ); ++i) {
36
+ #ifdef NBITSTREAM__LITTLE_ENDIAN_CPU
37
+ Buf[bytesPos+i] |= t.bytes [3 -i];
38
+ #else
39
+ Buf[bytesPos + i] |= t.bytes [i];
40
+ #endif
41
+ }
42
+
52
43
BitsUsed += n;
53
44
}
54
- */
55
- unsigned long long TBitStream::Read (int n) {
56
- if (n >23 || n < 0 )
57
- abort ();
45
+
46
+ uint32_t TBitStream::Read (int n) {
47
+ if (n >23 || n < 0 )
48
+ abort ();
58
49
const int bytesPos = ReadPos / 8 ;
59
50
const int overlap = ReadPos % 8 ;
60
- TMix t;
61
- for (int i = 0 ; i < n/8 + (overlap ? 2 : 1 ); ++i) {
62
- t.bytes [7 -i] = (uint8_t )Buf[bytesPos+i];
63
- }
51
+
52
+ UBytes t;
53
+ for (int i = 0 ; i < n/8 + (overlap ? 2 : 1 ); ++i) {
54
+ #ifdef NBITSTREAM__LITTLE_ENDIAN_CPU
55
+ t.bytes [3 -i] = (uint8_t )Buf[bytesPos+i];
56
+ #else
57
+ t.bytes [i] = (uint8_t )Buf[bytesPos+i];
58
+ #endif
59
+ }
64
60
65
- t. ull = (t.ull << overlap >> (64 - n));
66
- ReadPos += n;
67
- return t.ull ;
61
+ t. ui = (t.ui << overlap >> (32 - n));
62
+ ReadPos += n;
63
+ return t.ui ;
68
64
}
69
65
70
66
unsigned long long TBitStream::GetSizeInBits () const {
0 commit comments