私はこのようなC構造体を持っています...
struct icmp_prefixopt {
u_int8_t icmpopt_type;
u_int8_t icmpopt_len;
u_int8_t prefixlen;
u_int8_t lflag:1;
u_int8_t aflag:1;
u_int8_t reserved:6;
};
そして私は同じモジュールでこのようなメンバーに値を提供しました-
popt= (struct icmp_prefixopt *)
malloc(sizeof(struct icmp_prefixopt));
popt->icmpopt_type = 3;
popt->icmpopt_len = 4;
popt->prefixlen = (u_int8_t)strtoul(arg, (char **)NULL, 0);
arg = index(arg, '+');
if (arg) {
++arg;
popt->lflag = ((u_int8_t)strtoul(arg, (char **)NULL, 0))&1;
}
arg = index(arg, '+');
if (arg) {
++arg;
popt->aflag = ((u_int8_t)strtoul(arg, (char **)NULL, 0))&1;
}
arg = index(arg, '+');
if (arg) {
++arg;
popt->reserved = 32; //((u_int8_t)strtoul(arg, (char **)NULL, 0))<<2;
}
ここで、argは、このモジュールに渡されるコマンドライン引数です。
16進形式で実行した後の構造の内容を見てみましょう->
03 04 20 81
icmpopt_type: seems fine
icmpopt_len: seems fine
prefixlen: seems fine
しかし、ビットは、それらの構成バイトの他の3つのフィールドでは逆になっているように見えます-
lflag:1; aflag:1; reserved:6
だからそうあるべきだった-10100000=A0
しかし実際には彼らは=>81=10000001
それは私に多くの質問を引き起こします...
リトルエンディアン/ビッグエンディアンと関係がありますか?
はいの場合、8ビットのhtonlやhtonsなどの関数に対応するものは何ですか。
いいえの場合、考えられる問題は何でしょうか、または何かを完全に誤解したことがありますか?
最善のアプローチは何ですか?
構造自体の中でこれらのフィールドの順序を変更したり、ビットごとの演算子を適用してここでビットをシフトしたりするには?
コマンドラインで提供される入力-
32+1+0+32
テスト用にモジュール自体に32を修正したので、この最後の32はここでは目的を果たしません。私の実際の目的はこの分野も考慮する必要がありますが。
別のアプローチですぐに私を助けてください。
よろしくお願いします。
編集:
これは私が作成する必要のある実際の構造であり、作成とともに、ユーザーがGUIを介してすべてのフィールドの値を指定できるようにする必要があります。(現在、Linuxコマンドラインからのみ)。
私は今問題をより明確にしたと思いますが、それでもさらに情報が必要な場合は、追加させていただきます。