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 保证的,但我不确定。我认为 Posix 还保证sizeofIPv4 地址是 4 个字节,所以你没问题。

您的代码不会清除数组的其他 32 个字节,因此它(还)不能以任何有用的方式用作键。除非key在文件范围内定义,在这种情况下它被初始化为零。

除了那些小问题,我看不出你所做的有什么问题。

作为一个假设的可移植性问题 - 即使在字段之前没有填充字节,如果值中有填充,那么理论上你可能会得到假阴性。假设您从不同来源构造了两个具有相同值但填充位不同的密钥 - 那么它们应该产生相同的密钥,但实际上没有。不过,我不会担心:任何奇怪到足以在整数类型中包含填充位的实现都可能太奇怪而无法提供 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_BYTELENin_addr 结构的第一个字节的二进制值是可以的(大多数系统上的 s_addr 但你仍然想明确指定它)。

unsigned char [IPV4_MAX_BYTELEN*2]如果您只想要其中的两个,您甚至可以将 key 声明为。

于 2012-04-11T15:43:18.130 回答