bireader 1.0.13 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # bireader
2
2
 
3
- A simple binary reader and writer that keeps track of your position to quickly create file structures. Includes shared naming conventions and multiple programmable calling for easy data conversions to do low level parsing. Accepts `Uint8Array` or `Buffer`.
3
+ A feature rich binary reader and writer that keeps track of your position to quickly create file structures. Includes shared naming conventions, programmable inputs and advanced math for easy data conversions to do low level parsing. Accepts `Uint8Array` or `Buffer`.
4
4
 
5
5
  Supported data types are:
6
6
 
@@ -20,70 +20,159 @@ Supported data types are:
20
20
 
21
21
  Provides both CommonJS and ES modules.
22
22
 
23
- ### Quick Start
23
+ ### Example
24
24
 
25
25
  Import the reader or writer. Create a new parser with the data and start parsing.
26
26
 
27
- Includes all presents for quick parsing or programmable functions (examples below).
27
+ Includes presents for quick parsing or programmable functions (examples below).
28
28
 
29
29
  ```javascript
30
30
  import {bireader, biwriter} from 'bireader';
31
31
 
32
- //example of using mixed preset function naming and programmable calls
33
- function header_read(data){
32
+ //parse a webp file example
33
+ function parse_webp(data){
34
34
  const br = new bireader(data)
35
+ br.hexdump({supressUnicode:true}) //console.log data as hex
36
+
37
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
38
+ // 00000 52 49 46 46 98 3a 00 00 57 45 42 50 56 50 38 58 RIFF.:..WEBPVP8X
39
+ // 00010 0a 00 00 00 10 00 00 00 ff 00 00 ff 00 00 41 4c ..............AL
40
+ // 00020 50 48 26 10 00 00 01 19 45 6d 1b 49 4a 3b cf 0c PH&.....Em.IJ;..
41
+ // 00030 7f c0 7b 60 88 e8 ff 04 80 a2 82 65 56 d2 d2 86 ..{`.......eV...
42
+ // 00040 24 54 61 d0 83 8f 7f 0e 82 b6 6d e3 f0 a7 bd ed $Ta.......m.....
43
+ // 00050 87 10 11 13 40 3b 86 8f 26 4b d6 2a b7 6d 24 39 ....@;..&K.*.m$9
44
+ // 00060 52 4f fe 39 7f 3b 62 4e cc ec 9b 17 31 01 0c 24 RO.9.;bN....1..$
45
+ // 00070 49 89 23 e0 01 ab 52 64 e3 23 fc 61 db 76 cc 91 I.#...Rd.#.a.v..
46
+ // 00080 b6 7d fb 51 48 c5 69 db 4c 1b 63 db b6 ed b9 6d .}.QH.i.L.c....m
47
+ // 00090 db be 87 8d b1 6d db 9e b6 cd a4 d3 ee 24 95 54 .....m.......$.T
48
+ // 000a0 52 b8 8e 65 a9 eb 38 ce ab 52 75 9d 67 ff 75 2f R..e..8..Ru.g.u/
49
+ // 000b0 77 44 40 94 6d 25 6c 74 91 a8 88 86 58 9b da 6e wD@.m%lt....X..n
50
+
35
51
  const header = {}
36
- header.magic = br.cstring({length:4})
37
- const unsigned = header.magic == "foo" ? true : false
38
- header.ver = br.int32(unsigned, unsigned == true : "big" : "little")
39
- br.skip(2) //reserved
40
- if(header.ver == 10){
41
- br.endianness("big")
42
- header.file_size = br.size
43
- header.heigth = br.uint()
44
- header.width = br.quad()
45
- } else if(header.ver < 9) {
46
- br.le()
47
- header.file_size = br.ushort()
48
- header.heigth = br.uword()
49
- header.width = br.uint64()
50
- } else {
51
- throw new Error('Unknown version of ' + header.ver)
52
+ header.magic = br.string({length:4}) //RIFF
53
+ header.size = br.uint32le() //15000
54
+ header.fileSize = header.size + 8 //15008
55
+ header.payload = br.string({length:4}) //WEBP
56
+ header.format = br.string({length:4}) //VP8X
57
+ header.formatChunkSize = br.uint32le() //10
58
+ switch (header.format){
59
+ case "VP8 ":
60
+ header.formatType = "Lossy"
61
+ var read_size = 0
62
+ header.frame_tag = ubit24()
63
+ read_size += 3;
64
+ header.key_frame = header.frame_tag & 0x1;
65
+ header.version = (header.frame_tag >> 1) & 0x7;
66
+ header.show_frame = (header.frame_tag >> 4) & 0x1;
67
+ header.first_part_size = (header.frame_tag >> 5) & 0x7FFFF;
68
+ header.start_code = ubit24() //should be 2752925
69
+ header.horizontal_size_code = ubit16();
70
+ header.width = header.horizontal_size_code & 0x3FFF;
71
+ header.horizontal_scale = header.horizontal_size_code >> 14;
72
+ header.vertical_size_code = ubit16();
73
+ header.height = header.vertical_size_code & 0x3FFF;
74
+ header.vertical_scale = header.vertical_size_code >> 14;
75
+ read_size += 7;
76
+ header.VP8data = br.extract(header.formatChunkSize - read_size, true)
77
+ break;
78
+ case "VP8L":
79
+ header.formatType = "Lossless"
80
+ var read_size = 0
81
+ header.signature = br.ubyte() // should be 47
82
+ read_size += 1;
83
+ header.readWidth = ubit14()
84
+ header.width = header.readWidth+1;
85
+ header.readHeight = ubit14()
86
+ header.height = header.readHeight+1;
87
+ header.alpha_is_used = bit1()
88
+ header.version_number = ubit3()
89
+ read_size += 4;
90
+ header.data = br.extract(header.formatChunkSize - read_size, true)
91
+ break;
92
+ case "VP8X":
93
+ header.formatType = "Extended"
94
+ br.big() //switch to Big Endian bit read
95
+ header.rsv = br.bit2() //Reserved
96
+ header.I = br.bit1() //ICC profile
97
+ header.L = br.bit1() //Alpha
98
+ header.E = br.bit1() //Exif
99
+ header.X = br.bit1() //XMP
100
+ header.A = br.bit1() //Animation
101
+ header.R = br.bit1() //Reserved
102
+ br.little() //return to little
103
+ header.rsv2 = br.ubit24()
104
+ header.widthMinus1 = br.ubit24()
105
+ header.width = header.widthMinus1 + 1
106
+ header.heightMinus1 = br.ubit24()
107
+ header.height = header.heightMinus1 + 1
108
+ if(header.I)
109
+ {
110
+ header.ICCP = br.string({length:4}) // Should be ICCP
111
+ header.ICCPChunkSize = br.uint32()
112
+ header.ICCPData = br.extract(header.ICCPChunkSize, true)
113
+ }
114
+ if(header.L)
115
+ {
116
+ header.ALPH = br.string({length:4}) // Should be ALPH
117
+ header.ALPHChunkSize = br.uint32() //4134
118
+ header.ALPHData = br.extract(header.ALPHChunkSize, true)
119
+ }
120
+ if(header.A)
121
+ {
122
+ header.ANI = br.string({length:4}) // Should be ANIM or ANIF
123
+ header.ANIChunkSize = br.uint32()
124
+ if(header.ANI == "ANIM")
125
+ {
126
+ header.BGColor = br.uint32()
127
+ header.loopCount = br.ushort()
128
+ header.ANIMData = br.extract(header.ANIChunkSize, true)
129
+ } else
130
+ if (header.ANI == "ANIF")
131
+ {
132
+ header.FrameX = br.ubit24()
133
+ header.FrameY = br.ubit24()
134
+ header.readFrameWidth = br.ubit24()
135
+ header.readFrameHeight = br.ubit24()
136
+ header.frameWidth = readFrameWidth + 1
137
+ header.frameHeight = readFrameHeight + 1
138
+ header.duration = br.ubit24()
139
+ header.rsv3 = br.ubit6()
140
+ header.byte.B = br.bit1() //Blending
141
+ header.byte.D = br.bit1() //Disposal
142
+ header.frameData = br.extract(16, true)
143
+ header.ANIFData = br.extract(header.ANIChunkSize, true)
144
+ }
145
+ }
146
+ header.extFormatStr = br.string({length:4})
147
+ header.extChunkSize = br.uint32()
148
+ header.extData = br.extract(header.extChunkSize, true)
149
+ if(header.E)
150
+ {
151
+ header.EXIF = br.string({length:4}) // Should be EXIF
152
+ header.EXIFChunkSize = br.uint32()
153
+ header.EXIFData = br.extract(header.EXIFChunkSize, true)
154
+ }
155
+ if(header.X)
156
+ {
157
+ header.XMP = br.string({length:4}) // Should be XMP
158
+ header.XMPChunkSize = br.uint32()
159
+ header.XMPMetaData = br.extract(header.XMPChunkSize, true)
160
+ }
161
+ break;
162
+ default:
163
+ header.data = br.extract(header.formatChunkSize, true)
164
+ break;
52
165
  }
53
166
  br.finished()
54
167
  return header
55
168
  }
56
169
 
57
- function header_write(size, magic, ver, heigth, width){
58
- const data = new Uint8Array(size)
59
- const bw = new biwriter(data)
60
- bw.writeString(magic, {length:4})
61
- const unsigned = true
62
- header.ver = bw.uint8(ver)
63
- if(header.ver == 10){
64
- bw.bit16() //reserved
65
- bw.uint32be(heigth)
66
- bw.quadbe(width)
67
- } else if(header.ver < 9) {
68
- bw.fskip(2) //reserved
69
- bw.uint16le(size)
70
- const bitsize = header.magic == "foo" ? 16 : 32
71
- const byteOffset = 0
72
- const bitOffset = 0
73
- bw.bit(heigth, bitsize, byteOffset, bitOffset0, unsigned)
74
- bw.int64le(width, byteOffset, unsigned)
75
- } else {
76
- throw new Error('Unknown version of ' + ver)
77
- }
78
- const header = bw.crop(0,size)
79
- bw.finished()
80
- return header
81
- }
170
+ TODO // write example
82
171
  ```
83
172
 
84
173
  ## Common Functions
85
174
 
86
- Common functions for setup and movement shared by both (unless indicated).
175
+ Common functions for setup, movement, manipulation and math shared by both.
87
176
 
88
177
  <table>
89
178
  <thead>
@@ -94,35 +183,99 @@ Common functions for setup and movement shared by both (unless indicated).
94
183
  </tr>
95
184
  </thead>
96
185
  <tbody>
186
+ <tr>
187
+ <th align="center" colspan="4"><i>Setup</i></th>
188
+ <tr>
97
189
  <tr>
98
190
  <td>Name</td>
99
- <td>new bireader(<b>data</b>, 1, 0, "big")</td>
100
- <td align="center" rowspan="2"><b>Buffer or Uint8Array</b>, byte offset, bit offset, endian</td>
191
+ <td>new bireader(<b>data</b>, byteOffset, bitOffset, endianess, strict)</td>
192
+ <td align="center" rowspan="2"><b>Buffer or Uint8Array</b>, byte offset (default 0), bit offset (default 0), endian big or little (default little), strict mode true to restrict extending initially supplied data (default true for reader, false for writer)</td>
101
193
  <td rowspan="2">new Constructor</td>
102
194
  </tr>
103
195
  <tr>
104
196
  <td>Name</td>
105
- <td>new biwriter(<b>data</b>, 0, 8, "little")</td>
197
+ <td>new biwriter(<b>data</b>, byteOffset, bitOffset, endianess, strict)</td>
106
198
  </tr>
107
199
  <tr>
108
200
  <td>Name</td>
109
- <td>endianness(<b>str</b>)</td>
201
+ <td>endianness(<b>bigOrLittle</b>)</td>
110
202
  <td align="center" rowspan="2"><b>big</b> or <b>little</b> (default little)</td>
111
203
  <td rowspan="2">Can be changed at any time.</td>
112
204
  </tr>
113
205
  <tr>
114
206
  <td>Presets</td>
115
- <td>bigEndian()<br>big()<br>be()<br>littleEndian()<br>little()<br>le()</td>
207
+ <td>bigEndian(), big(), be()<br>littleEndian(), little(), le()</td>
208
+ </tr>
209
+ <tr>
210
+ <td>Name</td>
211
+ <td>tell()</td>
212
+ <td align="center" rowspan="2">none</td>
213
+ <td rowspan="2">Gets current byte position in bytes</td>
214
+ </tr>
215
+ <tr>
216
+ <td>Aliases</td>
217
+ <td>getOffset()<br>saveOffset()</td>
218
+ </tr>
219
+ <tr>
220
+ <td>Name</td>
221
+ <td>get() </td>
222
+ <td align="center" rowspan="2">none</td>
223
+ <td rowspan="2">Returns supplied data.</td>
224
+ </tr>
225
+ <tr>
226
+ <td>Aliases</td>
227
+ <td>return()<br>data</td>
228
+ </tr>
229
+ <tr>
230
+ <td>Name</td>
231
+ <td>hexdump({length, startByte, supressUnicode})</td>
232
+ <td align="center">Length of dump, Byte to start the dump, Supress unicode character preview for cleaner columns</td>
233
+ <td >Console logs data. Defaults to current position and 192 bytes in length. Will trigger on error unless turned off (see below)</td>
234
+ </tr>
235
+ <tr>
236
+ <td>Name</td>
237
+ <td>errorDumpOff()</td>
238
+ <td align="center" >None</td>
239
+ <td >Does not hexdump on error (default true)</td>
240
+ </tr>
241
+ <tr>
242
+ <td>Name</td>
243
+ <td>errorDumpOn()</td>
244
+ <td align="center" >None</td>
245
+ <td >While hexdump on error (default true)</td>
246
+ </tr>
247
+ <tr>
248
+ <td>Name</td>
249
+ <td>unrestrict()</td>
250
+ <td align="center">none</td>
251
+ <td>Sets strict mode to false, will extend array if data is outside of max size (default true for reader, false for writer)</td>
252
+ </tr>
253
+ <tr>
254
+ <td>Name</td>
255
+ <td>restrict()</td>
256
+ <td align="center">none</td>
257
+ <td>Sets strict mode to true, won't extend array if data is outside of max size (default true for reader, false for writer)</td>
258
+ </tr>
259
+ <tr>
260
+ <td>Name</td>
261
+ <td>end()</td>
262
+ <td align="center" rowspan="2">none</td>
263
+ <td rowspan="2">Removes supplied data.</td>
264
+ </tr>
265
+ <tr>
266
+ <td>Aliases</td>
267
+ <td>close()<br>done()<br>finished()</td>
116
268
  </tr>
269
+ <th align="center" colspan="4"><i>Movement</i></th>
117
270
  <tr>
118
271
  <td>Name</td>
119
272
  <td>skip(<b>bytes</b>, bits)</td>
120
- <td align="center" rowspan="2"><b>bytes to skip from current position</b>, bits to skip</td>
273
+ <td align="center" rowspan="2"><b>bytes to skip from current byte position</b>, bits to skip</td>
121
274
  <td rowspan="2">Use negative to go back.<br><b>Note:</b> Remaining bits are dropped when returning to a byte read.</td>
122
275
  </tr>
123
276
  <tr>
124
- <td>Aliases</td>
125
- <td>fskip(<b>bytes</b>, bits)</td>
277
+ <td>Alias</td>
278
+ <td>jump(<b>bytes</b>, bits)</td>
126
279
  </tr>
127
280
  <tr>
128
281
  <td>Name</td>
@@ -132,80 +285,152 @@ Common functions for setup and movement shared by both (unless indicated).
132
285
  </tr>
133
286
  <tr>
134
287
  <td>Aliases</td>
135
- <td>seek(<b>byte</b>, bit)<br>fseek(<b>byte</b>, bit)<br>pointer(<b>byte</b>, bit)<br>warp(<b>byte</b>, bit)<br>fsetpos(<b>byte</b>, bit)</td>
288
+ <td>seek(<b>byte</b>, bit)<br>pointer(<b>byte</b>, bit)<br>warp(<b>byte</b>, bit)</td>
136
289
  </tr>
137
290
  <tr>
138
291
  <td>Name</td>
139
292
  <td>rewind()</td>
140
293
  <td align="center" rowspan="2">none</td>
141
- <td rowspan="2">Moves current read position to start of data.</td>
294
+ <td rowspan="2">Moves current byte position to start of data.</td>
142
295
  </tr>
143
296
  <tr>
144
- <td>Aliases</td>
145
- <td>gotostart()<br>tostart()</td>
297
+ <td>Alias</td>
298
+ <td>gotostart()</td>
146
299
  </tr>
300
+ <th align="center" colspan="4"><i>Manipulation</i></th>
147
301
  <tr>
148
302
  <td>Name</td>
149
- <td>ftell()</td>
150
- <td align="center" rowspan="2">none</td>
151
- <td rowspan="2">Gets current read position in bytes</td>
303
+ <td>delete(startOffset, endOffset, consume)</td>
304
+ <td align="center" rowspan="2">start byte of data (default 0), end byte of data (default current byte position), move byte position to after data read (default false)</td>
305
+ <td rowspan="2">Removes and returns data. <br><b>Note:</b> Errors on strict mode</td>
152
306
  </tr>
153
307
  <tr>
154
- <td>Aliases</td>
155
- <td>tell()<br>fgetpos()</td>
308
+ <td>Alias</td>
309
+ <td>clip(startOffset, endOffset, consume)</td>
156
310
  </tr>
157
311
  <tr>
158
312
  <td>Name</td>
159
- <td>unrestrict()</td>
160
- <td align="center">none</td>
161
- <td><b>biwriter only:</b> Will extend array if data is written outside of max size (default on)</td>
313
+ <td>crop(<b>length</b>, consume)</td>
314
+ <td align="center" rowspan="2"><b>Number of bytes to read and remove</b>, move byte position to after data read (default false)</td>
315
+ <td rowspan="2">Removes and returns data from current byte position for length of data</b>.<br><b>Note:</b> Errors on strict mode</td>
316
+ </tr>
317
+ <tr>
318
+ <td>Alias</td>
319
+ <td>drop(<b>length</b>, consume)</td>
162
320
  </tr>
163
321
  <tr>
164
322
  <td>Name</td>
165
- <td>restrict()</td>
166
- <td align="center">none</td>
167
- <td><b>biwriter only:</b> Won't extend array if data is written outside of max size (default off)</td>
323
+ <td>lift(startByte, endByte, consume, fillValue)</td>
324
+ <td align="center" rowspan="2"><b>Start of byte read (default current byte position), end of byte read (default end of data)</b>, move current byte position to end of byte read (default false), value to fill bytes (will <b>NOT</b> fill on default)</td>
325
+ <td rowspan="2">Returns data from supplied byte positions. <br><b>Note:</b> Only moves current byte position if consume is true. Only fills data if value is supplied</td>
326
+ </tr>
327
+ <tr>
328
+ <td>Aliases</td>
329
+ <td>fill(startByte, endByte, consume, fillValue)</td>
168
330
  </tr>
169
331
  <tr>
170
332
  <td>Name</td>
171
- <td>crop(startOffset, endOffset)</td>
172
- <td align="center" rowspan="2">start byte of data, end byte of data</td>
173
- <td rowspan="2">Returns data truncated. defaults to 0 and current read / write position. <br><b>Note:</b> Does not affect supplied data or current read position.</td>
333
+ <td>extract(<b>length</b>, consume)</td>
334
+ <td align="center" rowspan="2"><b>Number of bytes to read</b>, move byte position to after data read (default false)</td>
335
+ <td rowspan="2">Returns data from current byte position for length of data</b>.</td>
174
336
  </tr>
175
337
  <tr>
176
338
  <td>Aliases</td>
177
- <td>clip(startOffset, endOffset)<br>truncate(startOffset, endOffset)<br>slice(startOffset, endOffset)</td>
339
+ <td>slice(<b>length</b>, consume)<br>wrap(<b>length</b>, consume)</td>
178
340
  </tr>
179
- <tr>
341
+ <tr>
180
342
  <td>Name</td>
181
- <td>extract(<b>length</b>)</td>
182
- <td align="center" rowspan="2"><b>length of data from current position</b></td>
183
- <td rowspan="2">Returns data from current read position to supplied length. <br><b>Note:</b> Does not affect supplied data or current read position.</td>
343
+ <td>insert(<b>data</b>, consume, offset)</td>
344
+ <td align="center" rowspan="2"><b>New data to insert</b>, move byte position to after data read (default false), offset to insert (default current read position)</td>
345
+ <td rowspan="2"><b>Note:</b> Data type must match supplied data. Errors on strict mode</td>
184
346
  </tr>
185
347
  <tr>
186
348
  <td>Aliases</td>
187
- <td>wrap(<b>length</b>)<br>lift(<b>length</b>)</td>
349
+ <td>place(<b>data</b>, consume)</td>
188
350
  </tr>
189
351
  <tr>
190
352
  <td>Name</td>
191
- <td>get() </td>
192
- <td align="center" rowspan="2">none</td>
193
- <td rowspan="2">Returns supplied data.</td>
353
+ <td>unshift(<b>data</b>, consume)</td>
354
+ <td align="center" rowspan="2"><b>New data to insert</b>, move byte position to after data read (default false)</td>
355
+ <td rowspan="2">Adds new data to start of supplied data<br><b>Note:</b> Data type must match supplied data. Errors on strict mode</td>
194
356
  </tr>
195
357
  <tr>
196
358
  <td>Aliases</td>
197
- <td>return()<br>data</td>
359
+ <td>prepend(<b>data</b>, consume)</td>
198
360
  </tr>
199
361
  <tr>
200
362
  <td>Name</td>
201
- <td>end()</td>
202
- <td align="center" rowspan="2">none</td>
203
- <td rowspan="2">Removes supplied data.</td>
363
+ <td>push(<b>length</b>, consume)</td>
364
+ <td align="center" rowspan="2"><b>Number</b>, move byte position to after data read (default false)</td>
365
+ <td rowspan="2">Adds new data to end of supplied data<br><b>Note:</b> Data type must match supplied data. Errors on strict mode</td>
204
366
  </tr>
205
367
  <tr>
206
368
  <td>Aliases</td>
207
- <td>close()<br>done()<br>finished()</td>
369
+ <td>append(<b>data</b>, consume)</td>
370
+ </tr>
371
+ <th align="center" colspan="4"><i>Math</i></th>
372
+ <tr>
373
+ <td>Name</td>
374
+ <td>XOR(<b>xorKey</b>, startOffset, endOffset, consume)
375
+ <td align="center"><b>Byte value, string, Uint8Array or Buffer</b>, byte position to start (default current position), byte position to end (default end of data), move byte position to after operation (default false)</td>
376
+ <td >XOR data</td>
377
+ </tr>
378
+ <tr>
379
+ <td>Name</td>
380
+ <td>XORThis(<b>xorKey</b>, length, consume)
381
+ <td align="center"><b>Byte value, string, Uint8Array or Buffer</b>, length of bytes starting at current byte (repeats when longer, default 1 byte for byte value, string length or end of data for string, array length or end of data for Uint8Array or Buffer), byte position to end (default end of data), move byte position to after operation (default false)</td>
382
+ <td>XOR data</td>
383
+ </tr>
384
+ <tr>
385
+ <td>Name</td>
386
+ <td>OR(<b>orKey</b>, startOffset, endOffset, consume)
387
+ <td align="center"><b>Byte value, string, Uint8Array or Buffer</b>, byte position to start (default current position), byte position to end (default end of data), move byte position to after operation (default false)</td>
388
+ <td >OR data</td>
389
+ </tr>
390
+ <tr>
391
+ <td>Name</td>
392
+ <td>ORThis(<b>orKey</b>, length, consume)
393
+ <td align="center"><b>Byte value, string, Uint8Array or Buffer</b>, length of bytes starting at current byte (repeats when longer, default 1 byte for byte value, string length or end of data for string, array length or end of data for Uint8Array or Buffer), byte position to end (default end of data), move byte position to after operation (default false)</td>
394
+ <td>OR data</td>
395
+ </tr>
396
+ <tr>
397
+ <td>Name</td>
398
+ <td>AND(<b>andKey</b>, startOffset, endOffset, consume)
399
+ <td align="center"><b>Byte value, string, Uint8Array or Buffer</b>, byte position to start (default current position), byte position to end (default end of data), move byte position to after operation (default false)</td>
400
+ <td >AND data</td>
401
+ </tr>
402
+ <tr>
403
+ <td>Name</td>
404
+ <td>ANDThis(<b>andKey</b>, length, consume)
405
+ <td align="center"><b>Byte value, string, Uint8Array or Buffer</b>, length of bytes starting at current byte (repeats when longer, default 1 byte for byte value, string length or end of data for string, array length or end of data for Uint8Array or Buffer), byte position to end (default end of data), move byte position to after operation (default false)</td>
406
+ <td>AND data</td>
407
+ </tr>
408
+ <tr>
409
+ <td>Name</td>
410
+ <td>LSHIFT(<b>value</b>, startOffset, endOffset, consume)
411
+ <td align="center"><b>Value</b>, byte position to start (default current position), byte position to end (default end of data), move byte position to after operation (default false)</td>
412
+ <td >Left shift data (per byte)</td>
413
+ </tr>
414
+ <tr>
415
+ <td>Name</td>
416
+ <td>LSHIFTThis(<b>value</b>, length, consume)
417
+ <td align="center"><b>Value</b>, length of bytes starting at current byte (default 1), byte position to end (default end of data), move byte position to after operation (default false)</td>
418
+ <td>Left shift data (per byte)</td>
419
+ </tr>
420
+ <tr>
421
+ <td>Name</td>
422
+ <td>RSHIFT(<b>value</b>, startOffset, endOffset, consume)
423
+ <td align="center"><b>Value</b>, byte position to start (default current position), byte position to end (default end of data), move byte position to after operation (default false)</td>
424
+ <td >Right shift data (per byte)</td>
425
+ </tr>
426
+ <tr>
427
+ <td>Name</td>
428
+ <td>RSHIFTThis(<b>value</b>, length, consume)
429
+ <td align="center"><b>Value</b>, length of bytes starting at current byte (default 1), byte position to end (default end of data), move byte position to after operation (default false)</td>
430
+ <td>Right shift data (per byte)</td>
208
431
  </tr>
432
+
433
+
209
434
  </tbody>
210
435
  </table>
211
436
 
@@ -213,7 +438,7 @@ Common functions for setup and movement shared by both (unless indicated).
213
438
 
214
439
  Parse value as a bit field. There are 32 functions from bit1 to bit32 and can be signed or unsigned (with a ``u`` at the start) and in little or big endian order (``be`` or ``le`` at the end).
215
440
 
216
- **Note:** Remaining bits are dropped when returning to a byte read. Example, after using ``bit4()`` then ``ubyte()``, the read locations drops the remaining 4 bits after ``bit4()`` when reading ``ubyte()``.
441
+ **Note:** Remaining bits are dropped when returning to a byte read. Example, after using ``bit4()`` then ``ubyte()``, the read locations drops the remaining 4 bits after ``bit4()`` when reading ``ubyte()``. Also any bit reading under 8 will always be unsigned.
217
442
 
218
443
  <table>
219
444
  <thead>