私はネットワークデータストリームの解析に取り組んでいますが、データストリームを直接データ構造にマップする方法があるかどうかは疑問です。C++で構造体メンバ(ビットフィールドを含む)間のパディングを制御する方法はありますか?
たとえば、次のようにRTPプロトコルのデータ構造を定義します。
class RTPHeader
{
int version:2; // The first two bits is version.
int P:1; // The next bits is an field P.
int X:1;
int CC:4;
int M:1;
int PT:7;
int sequenceNumber;
int64 timestamp;
.....
};
このように使用します。
RTPHeader header;
memcpy(&header, steamData, sizeof(header));
しかし、C++コンパイラは、メンバー間のパディングを挿入するように、パディングが(ビットフィールドメンバを含む)の部材との間に追加されないようにそれを制御する方法はありますか?
私の例ではビットフィールドがある可能性があるので、この質問はHow to get rid of padding bytes between data members of a structの複製ではありません。あなたはこれが私のためにうまく働いた
#pragma pack(push,n) // use n = 1 to have 1 Byte resolution
typedef struct {...}MY_STRUCT;
#pragma pack(pop)
を使用することができますパディングバイトの挿入を回避するために
私はこれを行う標準的な方法はないと思うが、あなたのコンパイラはいくつかの拡張子を持つかもしれない。 VSにはそれがあります)、あなたはパディングをコントロールすることができます。私は誰かが私を間違っていることを証明したい。 –
ビットフィールドは8の倍数になります(驚くことはありません)。あなたがクラス/構造体をパックするようにコンパイラに指示するならば、あなたはOKであるはずです。 –
ビットフィールド間にパディングが追加されているとは思いませんか?それはそうでなければビットフィールドのポイントを打ち負かしてしまうだろう。 –