1

次のスニペットを検討してください。

#define IPV4_MAX_BYTELEN  4
struct gen_entry
{
  struct in_addr addr;
  struct in_addr mask;
  ..
};
unsigned char key[40];

memcpy (key, &fec->addr, IPV4_MAX_BYTELEN);
memcpy (key + IPV4_MAX_BYTELEN, &fec->mask, IPV4_MAX_BYTELEN);
..

私が望むのは、IP アドレスとマスクの両方をバイナリ キーにマージすることです。配列サイズがこの目的に十分である場合、この方法でマージしても問題ありませんか? (または私は何かが欠けていますか?)

ありがとう !

4

3 に答える 3

1

これは通常、「マージ」ではなく「連結」と呼ばれます。

移植性のために、それが最初のものであると仮定するのではなく、 のs_addrフィールドを明示的に使用できます。struct in_addrおそらくそれはPosixによって保証されていますが、私にはわかりません。sizeofPosixは IPv4 アドレスが 4 バイトであることも保証していると思いますので、問題ありません。

あなたのコードは配列の残りの 32 バイトをクリアしていないため、(まだ) 有用な方法でキーとして使用することはできません。ファイルスコープkeyで定義されている場合を除き、その場合はゼロに初期化されます。

それらの些細な問題を除けば、あなたがしていることに何の問題もありません。

移植性の問題として、のフィールドの前にパディングバイトがない場合でも、値にパディングビットがある場合、理論的には偽陰性が発生する可能性があります。値は同じだがパディング ビットが異なる 2 つのキーを異なるソースから作成したとします。この場合、それらは同じキーを生成するはずですが、実際にはそうではありません。ただし、私はそれについて心配する必要はありません。整数型にパディング ビットを含めるほど奇妙な実装は、Posix ネットワーキング API を提供するにはおそらく奇妙すぎるでしょう。s_addrstruct in_addr

于 2012-04-11T15:43:34.863 に答える
1

構造体のサイズによって異なります。

検討:

memcpy (key, &fec->addr, sizeof(fec->addr));
memcpy (key + sizeof(fec->addr), &fec->mask, sizeof(fec->mask));

構造体のすべての値を確実に取得するため。

鍵の大きさはsizeof(fec->addr) + sizeof(fec->mask)

于 2012-04-11T15:44:44.657 に答える
0

IPV4_MAX_BYTELENはい、in_addr 構造体 (ほとんどのシステムでは s_addr ですが、明示的に指定する必要があります)の最初のバイトのバイナリ値を連結したい場合は問題ありません。

unsigned char [IPV4_MAX_BYTELEN*2]それらの2つだけが必要な場合は、 key を として宣言することもできます。

于 2012-04-11T15:43:18.130 に答える