私はlinuxでプログラミングしています。これは私にとって初めてのことです。私は、「レイヤー7」ネットワークプロトコルを設計するプロジェクトに取り組んでいます。これらのパケットにはリソースが含まれています。また、リソースの種類によっては、そのリソースの長さが異なります。私はC/C++にはまったく新しいものですが、私はすべてのことをよく理解しています。アイデアは、私が "一般的なリソース"型を作ることができ、それがどんなリソースであったかに応じて、このtypedef構造体へのポインタとしてvoid *をキャストして、それは "キャスティング"の世話をするだろう。とにかく、ここに私が思いついたものがあります:(C/C++)構造体を含む共用体を含む構造体...?
typedef struct _pktresource
{
unsigned char Type; // The type of the resource.
union {
struct { // This is used for variable length data.
unsigned short Size;
void *Data;
};
void *ResourceData; // Just a generic pointer to the data.
unsigned char Byte;
char SByte;
short Int16;
unsigned short UInt16;
int Int32;
unsigned int UInt32;
long long Int64;
unsigned long long UInt64;
float Float;
double Double;
unsigned int Time;
};
} pktresource, *ppktresource;
これの背後にある原理は単純でした。しかし、私が何かをするとき
pktresource.Size = XXXX
それは1バイトの代わりに構造体に4バイトを開始します。私はここで大きなコンセプトを理解していませんか?それは私のように感じるので。
編集:私はになってそのような冒頭で
pktresource.Type
それが起動などを参照する場合は、言及を忘れていました。
EDIT:正しい整列のためにプラグマステートメントを追加しました。修正後は、コードは次のようになります。
#pragma pack(push)
#pragma pack(1)
typedef struct _pktresource
{
unsigned char Type; // The type of the resource.
union {
struct { // This is used for variable length data.
unsigned short Size;
unsigned char Data[];
};
unsigned char ResourceData[]; // Just a generic pointer to the data.
unsigned char Byte;
char SByte;
short Int16;
unsigned short UInt16;
int Int32;
unsigned int UInt32;
long long Int64;
unsigned long long UInt64;
float Float;
double Double;
unsigned int Time;
};
} pktresource, *ppktresource;
#pragma pack(pop)
"私はLinuxでプログラミングしています。これは私にとって初めてのことです。"、 "私はC/C++の新機能です。" - ネットワークプロトコルを作成していますか? –
私はネットワーキング、プログラミング、またはLinux自体に新しいものではありません。私はWindows上で1つの言語または別の言語で約13年間プログラミングしています。あなたは私の質問に対する答えを知っていますか、それとも真実ではないと言いましたか? –
"私はWindows上で1つの言語または別の言語で約13年間プログラミングしていますが、まだC/C++を初めて使用しています。どの言語を使用していましたか? –