簡體   English   中英

(uint16_t *)和(uint32_t *)有什么區別?

[英]What is the difference between (uint16_t*) and (uint32_t*)?

如以下代碼所示, (uint16_t*)用於s ,而(uint32_t*)用於w 為什么? 此功能是否用於交換數據包中的目標MAC地址和源MAC地址?

static inline void      
swap_mac_addr(uint64_t pkt_ptr)
{
     uint16_t s;
     uint32_t w;

     /* assuming an IP/IPV6 pkt i.e. L2 header is 2 byte aligned, 4 byte non-aligned */
     s = *(uint16_t*)pkt_ptr;
     w = *(uint32_t*)(pkt_ptr+2);
     *(uint16_t*)pkt_ptr = *(uint16_t*)(pkt_ptr+6);                                                                                  
     *(uint32_t*)(pkt_ptr+2) = *(uint32_t*)(pkt_ptr+8);
     *(uint16_t*)(pkt_ptr+6) = s;
     *(uint32_t*)(pkt_ptr+8) = w;
}   

該代碼看起來就像是准備一個以太網數據包的答案,並在數據包頭中交換目標地址和源地址。

MAC地址具有48位。 即16 ​​+ 32,開發人員已決定使用16位數據類型加32位數據類型。 正如已經指出的那樣,這在現代的,積極優化的編譯器上可能會或可能無法正常工作。 即使這樣,它也可能無法在希望看到32位值與內存中的32位對齊的體系結構上起作用(例如,ARM)。

該代碼最好考慮將MAC地址視為字節數組,並使用memcpy來移動字節。

從性能的角度來看,當使用一個漂亮的笨拙的編譯器(考慮當今的標准)時,該構造可能會有所幫助。 在現代編譯器上,即使它可以正常工作,這些東西甚至會對性能產生負面影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM