M
M
MWX Library
検索…
expand_bytes()
バイト列を分解し変数に格納します。
1
const uint8_t* expand_bytes(
2
const uint8_t* b, const uint8_t* e, ...)
Copied!
expand_bytes()は、パラメータにuint8_t*型のイテレータの組み合わせを指定します。これは解析対象の先頭と末尾の次のイテレータの指定となります。eの位置まで解析が進んだ場合はエラーとなりnullptrを返します。
展開にエラーがない場合は、次の読み出しを行うイテレータを戻します。
可変数パラメータには以下を指定します。
バイト数
データ長
解説
uint8_t
1
uint16_t
2
ビッグエンディアン並びとして展開する
uint32_t
4
ビッグエンディアン並びとして展開する
uint8_t[N]
N
uint8_t 型の固定長配列
std::pair<char*,N>
N
char*,uint8_t*型の配列と配列長Nのペアmake_pair()で生成できる

1
auto&& rx = the_twelite.receiver.read();
2
3
char fourchars[5]{};
4
auto&& np =
5
expand_bytes(rx.get_payload().begin(), rx.get_payload().end()
6
, make_pair((uint8_t*)fourchars, 4)
7
);
8
9
// read rest of payload
10
uint8_t u8DI_BM_remote = 0xff;
11
uint16_t au16AI_remote[5];
12
expand_bytes(np, rx.get_payload().end()
13
, u8DI_BM_remote
14
, au16AI_remote[0]
15
, au16AI_remote[1]
16
, au16AI_remote[2]
17
, au16AI_remote[3]
18
, au16AI_remote[4]
19
);
Copied!
この例では、まず4バイトの文字列を読み出しています。ここではmake_pair()を用いて明示的に4バイト分のデータを読み出します。
戻されたイテレータnpをもとに、次のデータを読み出します。次のデータはuint8_t型、あとはuint16_t型が5つ続いています。

背景

無全パケットのデータペイロードの生成やデータの取り出しで用いられるuint8_t型のバイト配列の記述を簡素化するため。
1
auto&& rx = the_twelite.receiver.read();
2
char fourchars[5]{};
3
uint8_t u8DI_BM_remote = 0xff;
4
uint16_t au16AI_remote[5];
5
6
uint8_t *p = rx.get_payload().begin();
7
fourchars[0] = p[0];
8
fourchars[1] = p[1];
9
fourchars[2] = p[2];
10
fourchars[3] = p[3];
11
fourchars[4] = 0;
12
p += 4;
13
14
u8DI_BM_remote = (p[0] << 8) + p[1]; p+=2;
15
au16AI_remote[0] = (p[0] << 8) + p[1]; p+=2;
16
...
Copied!
上記はもっとも単純な記述だが、以下のようにByte array utilsを用いてバイト配列から読み出せる。
1
auto&& rx = the_twelite.receiver.read();
2
char fourchars[5]{};
3
uint8_t u8DI_BM_remote = 0xff;
4
uint16_t au16AI_remote[5];
5
6
uint8_t *p = rx.get_payload().begin();
7
fourchars[0] = G_OCTET(p);
8
fourchars[1] = G_OCTET(p);
9
fourchars[2] = G_OCTET(p);
10
fourchars[3] = G_OCTET(p);
11
fourchars[4] = 0;
12
13
u8DI_BM_remote = G_WORD(p);
14
au16AI_remote[0] = G_WORD(p);
15
...
Copied!
最終更新 3mo ago
PDFに出力
リンクのコピー
目次
背景