このようなプロトコルはすべてカスタムであるため、それらにアプローチする標準的な方法はありません。ADT (または「デザイン パターン」) に似ているのは、通常はリング バッファーを介して行われる実際のデータ受信だけです。
実際のプロトコルを解析するために通常行うことは、特別なことではありませんが、常に同じ方法で行われます。次のような結果になります。
(以下のコードでプレフィックス XYZ を使用して、コードが架空の「XYZ」プロトコルをデコードするためのものであることを示しています。カスタム プロトコルの名前に置き換えてください。)
// xyz.h
#ifndef XYZ_H
#define XYZ_H
typedef enum
{
XYZ_OK,
XYZ_ERR_SYNC, // various error codes for things that can go wrong
XYZ_ERR_LENGTH,
XYZ_ERR_CHECKSUM,
...
} xyz_result_t;
xyz_result_t xyz_decode (const uint8_t* buf, size_t n);
#endif /* XYZ_H */
// xyz.c
#include "xyz.h"
xyz_result_t xyz_decode (const uint8_t* buf, size_t n)
{
// various protocol-specific checks:
if(buf[0] != SOME_SYNC_CHARACTER)
{
return XYZ_ERR_SYNC;
}
if(buf[something] < expected_min_length ||
buf[something] > expected_max_length)
{
return XYZ_ERR_LENGTH;
}
...
return XYZ_OK;
}