2012-04-11 71 views
1

考慮如下因素片斷:「的memcpy」(合併兩種結構)

#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地址和子網掩碼。 以這種方式合併可以嗎?假設數組大小足夠用於 這個目的? (或我錯過了什麼?)

謝謝!

+0

謝謝大家的意見! – Mark 2012-04-11 16:17:21

回答

1

這通常被稱爲「連接」而不是「合併」。

爲便於攜帶,您可以明確地使用s_addr字段struct in_addr,而不是假設它是第一件事。雖然也許這是Posix保證的,但我不確定。我認爲Posix也保證sizeof的IPv4地址是4個字節,所以你沒問題。

你的代碼不會清除數組的其他32個字節,所以它不能以任何有用的方式用作關鍵字。除非key在文件範圍內定義,在這種情況下,它被初始化爲零。

除了那些小小的小問題,我沒有看到你在做什麼錯。

作爲一個假設的可移植性問題 - 即使沒有填充struct in_addrs_addr前場字節,如果有填充的值,那麼你可以在理論上得到假陰性。假設你從不同的源創建了兩個具有相同值但填充位不同的密鑰 - 那麼它們應該產生相同的密鑰,但實際上不會。不過,我不擔心這個問題:任何足夠奇怪的實現填充整數類型的位可能太奇怪,無法提供Posix網絡API。

0

是的,如果要連接in_addr結構體的第一個IPV4_MAX_BYTELEN字節的二進制值(大多數系統上是s_addr,但您仍希望明確指定它),那麼可以。

如果您只想要這兩個密鑰,您甚至可以將密鑰聲明爲unsigned char [IPV4_MAX_BYTELEN*2]

1

這取決於結構的大小。

考慮:

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

爲了確保您獲得的所有值的結構。

密鑰的大小是sizeof(fec->addr) + sizeof(fec->mask)

+0

第二個memcpy將是'key + sizeof(fec-> addr)'。另外要小心,你錯過了第一個尺寸的'>' – Eregrith 2012-04-11 15:46:31

+0

@Eregrith - 感謝你發現這些錯誤。固定。 – gbulmer 2012-04-11 15:50:11