Flexible memory buffer optimized for binary mangling
Class ByteBuf( [sizeOrObject],[extrasizeOrAdopt] )
| sizeOrObject | |
| extrasizeOrAdopt |
A ByteBuf is a growable memory buffer with methods to read and write primitive datatypes and strings. It supports streaming data in and out as well as random access.
For convenience, it can be converted to a MemBuf, at your option with zero cost.
Endianness can optionally be changed, by default it stores data in native endian of the host machine.
The constructor takes the following parameters:
Anything else passed into the constructor will raise a ParamError. Note that the constructor does not set/copy read or write positions or anything else.
Example code for basic usage:
bb = ByteBuf(30) // create a ByteBuf with an initial capacity of 30 bytes
bb.setEndian(ByteBuf.LITTLE_ENDIAN) // we store everything as little endian
bb.w16(0, 42, -16) // append 2 uint16 and 1 int16
bb.wf(0.5) // append a float
bb.write("Hello world") // append a string, char size 1
// .. write more data ..
// now final buffer size is known
bb.setEndian(ByteBuf.BIG_ENDIAN) // the next written bytes are stored in network byte order
bb.wpos(0).w16(bb.size()) // seek back to start and put total size there, in big endian
mb = bb.toMemBuf()
// -- encrypt everything except the first 2 bytes and send via network --
....
// -- receive membuf on the other side --
bb = ByteBuf(mb, true) // wrap a ByteBuf around the MemBuf, without copying occupied memory
bb.setEndian(ByteBuf.BIG_ENDIAN) // read in network byte order
size = bb.r16() // read total size
bb.setEndian(ByteBuf.LITTLE_ENDIAN) // rest of the buffer is in little endian
// -- decrypt remaining (size - 2) bytes --
a = bb.r16() // = 42
b = bb.r16(true) // (this is a signed short) = -16
f = bb.rf() // = ~ 0.5 (maybe slight precision loss)
s = bb.readString() // string is null terminated, and char size 1
// .. read remaining data ..
| Properties | |
| BIG_ENDIAN | |
| LITTLE_ENDIAN | |
| NATIVE_ENDIAN | |
| REVERSE_ENDIAN | |