expand-bytes()
const uint8_t* expand_bytes(
const uint8_t* b, const uint8_t* e, ...)
expand_bytes()
takes a combination of iterators of type uint8_t*
as parameters. These specify the beginning of the target to be parsed and the iterator just past the end. If parsing reaches the position of e
, it results in an error and returns nullptr
.
If there is no error in expansion, it returns the iterator for the next reading.
The variable parameters should be specified as follows:
Number of bytes | Data length | Explanation |
---|---|---|
uint8_t | 1 | |
uint16_t | 2 | Expanded as big-endian order |
uint32_t | 4 | Expanded as big-endian order |
uint8_t[N] | N | Fixed-length array of uint8_t |
std::pair<char*,N> | N | A pair of array and array length N of type char* or uint8_t* created by make_pair() |
Example
auto&& rx = the_twelite.receiver.read();
char fourchars[5]{};
auto&& np =
expand_bytes(rx.get_payload().begin(), rx.get_payload().end()
, make_pair((uint8_t*)fourchars, 4)
);
// read rest of payload
uint8_t u8DI_BM_remote = 0xff;
uint16_t au16AI_remote[5];
expand_bytes(np, rx.get_payload().end()
, u8DI_BM_remote
, au16AI_remote[0]
, au16AI_remote[1]
, au16AI_remote[2]
, au16AI_remote[3]
, au16AI_remote[4]
);
In this example, first a 4-byte string is read. Here, make_pair()
is used to explicitly read 4 bytes of data.
Using the returned iterator np
as a base, the next data is read. The next data consists of a uint8_t
type followed by five uint16_t
types.
Background
To simplify the description of byte arrays of type uint8_t
used for generating and extracting data payloads of wireless packets.
auto&& rx = the_twelite.receiver.read();
char fourchars[5]{};
uint8_t u8DI_BM_remote = 0xff;
uint16_t au16AI_remote[5];
uint8_t *p = rx.get_payload().begin();
fourchars[0] = p[0];
fourchars[1] = p[1];
fourchars[2] = p[2];
fourchars[3] = p[3];
fourchars[4] = 0;
p += 4;
u8DI_BM_remote = (p[0] << 8) + p[1]; p+=2;
au16AI_remote[0] = (p[0] << 8) + p[1]; p+=2;
...
The above is the simplest description, but you can read from byte arrays using Byte array utils as follows:
auto&& rx = the_twelite.receiver.read();
char fourchars[5]{};
uint8_t u8DI_BM_remote = 0xff;
uint16_t au16AI_remote[5];
uint8_t *p = rx.get_payload().begin();
fourchars[0] = G_BYTE(p);
fourchars[1] = G_BYTE(p);
fourchars[2] = G_BYTE(p);
fourchars[3] = G_BYTE(p);
fourchars[4] = 0;
u8DI_BM_remote = G_WORD(p);
au16AI_remote[0] = G_WORD(p);
...