blob: 0e3d61db5b60a0fc0bb86738d79a9925a15b9bce (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
#include "bitbuffer.h"
#include <memory.h>
#include <stdlib.h>
BitBuffer::BitBuffer()
{
buffer=0;
length=0;
bits=0;
}
void BitBuffer::WriteBit(char bit)
{
if (bits == 0)
Resize(length+1);
bit = !!bit;
unsigned char mask = 1 << (7-bits);
buffer[length-1] &= ~mask;
buffer[length-1] |= (bit << (7-bits));
bits=(bits+1)%8;
}
void BitBuffer::Resize(size_t newlen)
{
if (newlen > length)
{
unsigned char *new_buffer = (unsigned char *)realloc(buffer, newlen);
if (new_buffer)
{
buffer = new_buffer;
memset(buffer+length, 0, newlen-length); // zero out new data
length=newlen;
}
else
{
new_buffer = (unsigned char *)malloc(newlen);
if (new_buffer)
{
memcpy(new_buffer, buffer, length);
free(buffer);
buffer = new_buffer;
memset(buffer+length, 0, newlen-length); // zero out new data
length=newlen;
}
}
}
}
void BitBuffer::WriteBits(uintptr_t num, size_t bitlen)
{
for (size_t i=0;i!=bitlen;i++)
{
WriteBit((num >> (bitlen-i-1))&1);
}
}
void BitBuffer::WriteBytes(void *buffer, size_t bytes)
{
unsigned char *b = (unsigned char *)buffer;
for (size_t i=0;i!=bytes;i++)
WriteBits(b[i], 8);
}
void BitBuffer::WriteByte(unsigned char byte)
{
for (size_t i=0;i!=8;i++)
{
WriteBit((byte >> (7-i))&1);
}
}
|