M
M
MWX Library
検索…
pack_bytes()
要素データを並べてバイト列を生成します。
1
uint8_t* pack_bytes(uint8_t* b, uint8_t* e, ...)
Copied!
pack_bytesはコンテナクラスのbegin(),end()イテレータをパラメータとし、続くパラメータで指定されるデータをバイト列としてコンテナに書き込みます。
可変引数パラメータに与えるデータは以下に示すとおりです。
データ型
バイト数
解説
uint8_t
1
uint16_t
2
ビッグエンディアン並びで格納される
uint32_t
4
ビッグエンディアン並びで格納される
uint8_t[N]
N
uint8_t 型の固定長配列
std::pair<char*,N>
N
char*,uint8_t*型の配列と配列長のペア。make_pair()で生成できる。
1
smplbuf_u8& pack_bytes(smplbuf_u8& c, ...)
Copied!
pack_bytesはコンテナオブジェクトをパラメータとし、続くパラメータで指定されるデータをバイト列としてコンテナに書き込みます。コンテナの.push_back()メソッドで末尾に追加します。
可変引数パラメータに与えるデータは以下に示すとおりです。
データ型
バイト数
解説
uint8_t
1
uint16_t
2
ビッグエンディアン並びで格納される
uint32_t
4
ビッグエンディアン並びで格納される
uint8_t[N]
N
uint8_t 型の固定長配列
std::pair<char*,N>
N
char*,uint8_t*型の配列と配列長のペア。make_pair()で生成できる。
smplbuf_u8?
.size()
uint8_t型のsmplbuf<>コンテナ。コンテナ長(.size())のデータを格納する。

1
auto&& rx = the_twelite.receiver.read();
2
3
smplbuf<uint8_t, 128> buf;
4
mwx::pack_bytes(buf
5
, uint8_t(rx.get_addr_src_lid()) // src addr (LID)
6
, uint8_t(0xCC) // cmd id (0xCC, fixed)
7
, uint8_t(rx.get_psRxDataApp()->u8Seq) // seqence number
8
, uint32_t(rx.get_addr_src_long()) // src addr (long)
9
, uint32_t(rx.get_addr_dst()) // dst addr
10
, uint8_t(rx.get_lqi()) // LQI
11
, uint16_t(rx.get_length()) // payload length
12
, rx.get_payload() // payload
13
);
Copied!
この例では受信パケットの各属性やペイロードを別のバッファbufに再格納しています。

背景

無全パケットのデータペイロードの生成やデータの取り出しで用いられるuint8_t型のバイト配列の記述を簡素化するため。
1
auto&& rx = the_twelite.receiver.read();
2
3
uint8_t data[128];
4
data[0] = rx.get_addr_src_lid();
5
data[1] = 0xCC;
6
data[2] = rx.get_psRxDataApp()->u8Seq;
7
data[4] = rx.get_addr_src_long() & 0x000000FF;
8
data[5] = (rx.get_addr_src_long() & 0x0000FF00) >> 8;
9
data[6] = (rx.get_addr_src_long() & 0x00FF0000) >> 16;
10
data[7] = (rx.get_addr_src_long() & 0xFF000000) >> 24;
11
...
Copied!
上記はもっとも単純な記述だが、以下のようにByte array utilsを用いてバイト配列を生成できる。
1
auto&& rx = the_twelite.receiver.read();
2
3
uint8_t data[128], *q = data;
4
S_OCTET(q, rx.get_addr_src_lid());
5
S_OCTET(q, 0xCC);
6
S_OCTET(q, rx.get_psRxDataApp()->u8Seq);
7
S_DWORD(q, rx.get_addr_src_long());
8
S_DWORD(q, rx.get_addr_dst());
9
S_OCTET(q, rx.get_lqi());
10
S_WORD(q, rx.get_length());
11
for (auto x : rx.get_payload()) {
12
S_OCTET(q, x);
13
}
Copied!
最終更新 1yr ago
PDFに出力
リンクのコピー
目次
背景