1
- local BitStream = {}
2
-
3
- BitStream .UINT8 = 0 ; BitStream .UINT16 = 1 ; BitStream .UINT32 = 2 ;
4
- BitStream .INT8 = 3 ; BitStream .INT16 = 4 ; BitStream .INT32 = 5 ;
5
- BitStream .FLOAT = 6 ; BitStream .BOOL = 7 ; BitStream .STRING = 8 ;
6
-
7
- function BitStream :new (bytes )
8
- local bitStream =
9
- {
10
- WritePointer = 1 ,
11
- ReadPointer = 1 ,
12
- BytesData = ' ' ,
13
- BSCheckPoint = true
14
- }
15
-
16
- if type (bytes ) == ' string' then
17
- bitStream .BytesData = bytes
18
- bitStream .ReadPointer = # bytes + 1
19
- bitStream .WritePointer = # bytes + 1
20
- end
21
-
22
- function bitStream :import (bytes )
23
- bytes = type (bytes ) == ' string' and bytes or ' \0 '
24
-
25
- local wpointer = bitStream .WritePointer
26
- local saveData = string.sub (bitStream .BytesData , wpointer , # bitStream .BytesData )
27
- bitStream .BytesData = string.sub (bitStream .BytesData , 0 , wpointer - 1 )
28
- bitStream .BytesData = bitStream .BytesData .. bytes .. saveData
29
-
30
- return bitStream
31
- end
32
- function bitStream :export ()
33
- return bitStream .BytesData
34
- end
35
-
36
- function bitStream :setReadPointer (pos )
37
- pos = type (pos ) == ' number' and pos or 1
38
- if pos < 1 then pos = 1 end
39
- bitStream .ReadPointer = pos
40
- return bitStream
41
- end
42
- function bitStream :setWritePointer (pos )
43
- pos = type (pos ) == ' number' and pos or 1
44
- if pos < 1 then pos = 1 end
45
- bitStream .WritePointer = pos
46
- return bitStream
47
- end
1
+ local sizes = {
2
+ [UINT8 ] = 1 , [UINT16 ] = 2 , [UINT32 ] = 4 ,
3
+ [INT8 ] = 1 , [INT16 ] = 2 , [INT32 ] = 4 ,
4
+ [FLOAT ] = 4 , [BOOL ] = 1
5
+ }
6
+ local function get_size (srcType )
7
+ return sizes [srcType ] or 0
8
+ end
48
9
49
- function bitStream .getReadPointer ()
50
- return bitStream .ReadPointer
51
- end
52
- function bitStream .getWritePointer ()
53
- return bitStream .WritePointer
10
+ local BSClass =
11
+ {
12
+ WritePointer = 1 ,
13
+ ReadPointer = 1 ,
14
+ BytesData = ' ' ,
15
+ __tostring = function ()
16
+ return ' BitStream'
54
17
end
55
-
56
- function bitStream :write (srcType , src )
57
- local wpointer = bitStream .WritePointer
58
- local saveData = string.sub (bitStream .BytesData , wpointer , # bitStream .BytesData )
59
- bitStream .BytesData = string.sub (bitStream .BytesData , 0 , wpointer - 1 )
60
-
61
- if srcType == BitStream .UINT8 then
62
- src = type (src ) == ' number' and src or 0
63
- bitStream .BytesData = bitStream .BytesData
64
- .. BitCoder :encode (BitStream .UINT8 , src )
65
- bitStream .WritePointer = bitStream .WritePointer + 1
66
- elseif srcType == BitStream .UINT16 then
67
- src = type (src ) == ' number' and src or 0
68
- bitStream .BytesData = bitStream .BytesData
69
- .. BitCoder :encode (BitStream .UINT16 , src )
70
- bitStream .WritePointer = bitStream .WritePointer + 2
71
- elseif srcType == BitStream .UINT32 then
72
- src = type (src ) == ' number' and src or 0
73
- bitStream .BytesData = bitStream .BytesData
74
- .. BitCoder :encode (BitStream .UINT32 , src )
75
- bitStream .WritePointer = bitStream .WritePointer + 4
76
- elseif srcType == BitStream .INT8 then
77
- src = type (src ) == ' number' and src or 0
78
- bitStream .BytesData = bitStream .BytesData
79
- .. BitCoder :encode (BitStream .INT8 , src )
80
- bitStream .WritePointer = bitStream .WritePointer + 1
81
- elseif srcType == BitStream .INT16 then
82
- src = type (src ) == ' number' and src or 0
83
- bitStream .BytesData = bitStream .BytesData
84
- .. BitCoder :encode (BitStream .INT16 , src )
85
- bitStream .WritePointer = bitStream .WritePointer + 2
86
- elseif srcType == BitStream .INT32 then
87
- src = type (src ) == ' number' and src or 0
88
- bitStream .BytesData = bitStream .BytesData
89
- .. BitCoder :encode (BitStream .INT32 , src )
90
- bitStream .WritePointer = bitStream .WritePointer + 4
91
- elseif srcType == BitStream .FLOAT then
92
- src = type (src ) == ' number' and src or 0.0
93
- local res = BitCoder :encode (BitStream .FLOAT , src )
94
- bitStream .BytesData = bitStream .BytesData .. res
95
- bitStream .WritePointer = bitStream .WritePointer + # res
96
- elseif srcType == BitStream .BOOL then
97
- src = type (src ) == ' boolean' and src or false
98
- bitStream .BytesData = bitStream .BytesData
99
- .. BitCoder :encode (BitStream .BOOL , src )
100
- bitStream .WritePointer = bitStream .WritePointer + 1
101
- elseif srcType == BitStream .STRING then
102
- src = type (src ) == ' string' and src or ' \0 '
103
- bitStream .BytesData = bitStream .BytesData .. src
104
- bitStream .WritePointer = bitStream .WritePointer + # src
105
- end
106
-
107
- bitStream .BytesData = bitStream .BytesData .. saveData
108
- return bitStream
18
+ }
19
+
20
+ function BSClass :getReadPointer () return self .ReadPointer end
21
+ function BSClass :getWritePointer () return self .WritePointer end
22
+ function BSClass :export () return self .BytesData end
23
+ function BSClass :import (bytes )
24
+ bytes = type (bytes ) == ' string' and bytes or ' \0 '
25
+ local wpointer = self .WritePointer
26
+ local saveData = string.sub (self .BytesData , wpointer , # self .BytesData )
27
+ self .BytesData = string.sub (self .BytesData , 0 , wpointer - 1 )
28
+ self .BytesData = self .BytesData .. bytes .. saveData
29
+ return self
30
+ end
31
+ function BSClass :write (srcType , src )
32
+ local wpointer = self .WritePointer
33
+ local saveData = string.sub (self .BytesData , wpointer , # self .BytesData )
34
+ self .BytesData = string.sub (self .BytesData , 0 , wpointer - 1 )
35
+ if srcType >= UINT8 and srcType <= FLOAT then
36
+ src = type (src ) == ' number' and src or 0
37
+ self .BytesData = self .BytesData
38
+ .. BitCoder :encode (srcType , src )
39
+ self .WritePointer = self .WritePointer + get_size (srcType )
40
+ elseif srcType == BOOL then
41
+ src = type (src ) == ' boolean' and src or false
42
+ self .BytesData = self .BytesData
43
+ .. BitCoder :encode (srcType , src )
44
+ self .WritePointer = self .WritePointer + get_size (srcType )
45
+ elseif srcType == STRING then
46
+ src = type (src ) == ' string' and src or ' \0 '
47
+ self .BytesData = self .BytesData .. src
48
+ self .WritePointer = self .WritePointer + # src
109
49
end
50
+ self .BytesData = self .BytesData .. saveData
51
+ return self
52
+ end
53
+ function BSClass :read (srcType , src )
54
+ local part , rpointer = ' ' , self .ReadPointer
55
+ if srcType >= UINT8 and srcType <= BOOL then
56
+ self .ReadPointer = self .ReadPointer + get_size (srcType )
57
+ part = string.sub (self .BytesData , rpointer , self .ReadPointer - 1 )
58
+ elseif srcType == STRING then
59
+ self .ReadPointer = self .ReadPointer + tonumber (src )
60
+ part = string.sub (self .BytesData , rpointer , self .ReadPointer - 1 )
61
+ end ; return BitCoder :decode (srcType , part )
62
+ end
63
+ function BSClass :setReadPointer (pos )
64
+ pos = type (pos ) == ' number' and pos or 1
65
+ if pos < 1 then pos = 1 end
66
+ self .ReadPointer = pos
67
+ return self
68
+ end
69
+ function BSClass :setWritePointer (pos )
70
+ pos = type (pos ) == ' number' and pos or 1
71
+ if pos < 1 then pos = 1 end
72
+ self .WritePointer = pos
73
+ return self
74
+ end
110
75
111
- function bitStream :read (srcType , src ) -- for example, bitStream:read(BitStream.STRING, 15(string len))
112
- local rpointer = bitStream .ReadPointer
113
-
114
- if srcType == BitStream .UINT8 then
115
- bitStream .ReadPointer = bitStream .ReadPointer + 1
116
- local part = string.sub (bitStream .BytesData , rpointer , bitStream .ReadPointer - 1 )
117
- return BitCoder :decode (BitStream .UINT8 , part )
118
- elseif srcType == BitStream .UINT16 then
119
- bitStream .ReadPointer = bitStream .ReadPointer + 2
120
- local part = string.sub (bitStream .BytesData , rpointer , bitStream .ReadPointer - 1 )
121
- return BitCoder :decode (BitStream .UINT16 , part )
122
- elseif srcType == BitStream .UINT32 then
123
- bitStream .ReadPointer = bitStream .ReadPointer + 4
124
- local part = string.sub (bitStream .BytesData , rpointer , bitStream .ReadPointer - 1 )
125
- return BitCoder :decode (BitStream .UINT32 , part )
126
- elseif srcType == BitStream .INT8 then
127
- bitStream .ReadPointer = bitStream .ReadPointer + 1
128
- local part = string.sub (bitStream .BytesData , rpointer , bitStream .ReadPointer - 1 )
129
- return BitCoder :decode (BitStream .INT8 , part )
130
- elseif srcType == BitStream .INT16 then
131
- bitStream .ReadPointer = bitStream .ReadPointer + 2
132
- local part = string.sub (bitStream .BytesData , rpointer , bitStream .ReadPointer - 1 )
133
- return BitCoder :decode (BitStream .INT16 , part )
134
- elseif srcType == BitStream .INT32 then
135
- bitStream .ReadPointer = bitStream .ReadPointer + 4
136
- local part = string.sub (bitStream .BytesData , rpointer , bitStream .ReadPointer - 1 )
137
- return BitCoder :decode (BitStream .INT32 , part )
138
- elseif srcType == BitStream .FLOAT then
139
- bitStream .ReadPointer = bitStream .ReadPointer + 4
140
- local part = string.sub (bitStream .BytesData , rpointer , bitStream .ReadPointer - 1 )
141
- return BitCoder :decode (BitStream .FLOAT , part )
142
- elseif srcType == BitStream .BOOL then
143
- bitStream .ReadPointer = bitStream .ReadPointer + 1
144
- local part = string.sub (bitStream .BytesData , rpointer , bitStream .ReadPointer - 1 )
145
- return BitCoder :decode (BitStream .BOOL , part )
146
- elseif srcType == BitStream .STRING then
147
- src = type (src ) == ' number' and src or 1
148
- bitStream .ReadPointer = bitStream .ReadPointer + src
149
- local part = string.sub (bitStream .BytesData , rpointer , bitStream .ReadPointer - 1 )
150
- return BitCoder :decode (BitStream .STRING , part )
151
- end
76
+ BSClass .__index = BSClass
152
77
153
- return 0
78
+ local BitStream = {}
79
+ function BitStream :new (bytes )
80
+ local temp = {}
81
+ if bytes then
82
+ bytes = type (bytes ) == ' string' and bytes or ' \0 '
83
+ temp .BytesData = bytes
154
84
end
155
-
156
- return bitStream
85
+ setmetatable ( temp , BSClass )
86
+ return temp
157
87
end
158
88
159
89
return BitStream
0 commit comments