セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2024-12-02 現在

expand-bytes()

“バイト列を分解し変数に格納”
    バイト列を分解し変数に格納します。
    const uint8_t* expand_bytes(
            const uint8_t* b, const uint8_t* e, ...)

    expand_bytes()は、パラメータにuint8_t*型のイテレータの組み合わせを指定します。これは解析対象の先頭と末尾の次のイテレータの指定となります。eの位置まで解析が進んだ場合はエラーとなりnullptrを返します。

    展開にエラーがない場合は、次の読み出しを行うイテレータを戻します。

    可変数パラメータには以下を指定します。

    バイト数データ長解説
    uint8_t1
    uint16_t2ビッグエンディアン並びとして展開する
    uint32_t4ビッグエンディアン並びとして展開する
    uint8_t[N]Nuint8_t 型の固定長配列
    std::pair<char*,N>Nchar*,uint8_t*型の配列と配列長Nのペアmake_pair()で生成できる

    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]
    );

    この例では、まず4バイトの文字列を読み出しています。ここではmake_pair()を用いて明示的に4バイト分のデータを読み出します。

    戻されたイテレータnpをもとに、次のデータを読み出します。次のデータはuint8_t型、あとはuint16_t型が5つ続いています。

    背景

    無全パケットのデータペイロードの生成やデータの取り出しで用いられるuint8_t型のバイト配列の記述を簡素化するため。

    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;
    ...

    上記はもっとも単純な記述だが、以下のようにByte array utilsを用いてバイト配列から読み出せる。

    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);
    ...