簡體   English   中英

MAC地址上的網絡字節順序

[英]Network byte order on MAC address

我正在編寫一個代碼,要求我解析以uint8_t *指針形式接收的傳入幀。

我編寫了一種實用程序方法來從幀中獲取mac地址,並將其轉換為uint64_t值,以便於計算。

uint64_t addr = uint64_t(_frm_ptr[0]) << 40 | uint64_t(_frm_ptr[1]) << 32 | 
                       uint64_t(_frm_ptr[2]) << 24 | uint64_t(_frm_ptr[3]) << 16 | 
                       uint64_t(_frm_ptr[4]) << 8 | uint64_t(_frm_ptr[5]);

我需要知道,如果源mac地址以大字節序格式說“ b8:ac:6f:c0:3d:25”,會以相同的順序傳輸嗎?

Mac地址如何在網絡上傳輸?

上面的代碼段是否可以在所有平台上運行?

網絡字節順序為big-endian ,因此,如果您使用big-endian格式的地址,則將以這種方式進行發送和接收-不需要字節交換。

幀中的字節是固定順序的(@Caleb指出是big-endian),與主機的字節順序無關。

由於您要一一復制字節,因此這將始終有效。 當您將幀數據中的多字節分配或memcpy用作shortint ,...時,只有一個問題。看看ntohs()將網絡轉換為主機,反之亦然的朋友。

MAC地址的標准表示法(也稱為規范格式)以傳輸位順序寫入,其中最低有效位先傳輸。

IEEE 802.3(以太網)和IEEE 802.4(令牌總線)通過導線從左到右發送字節(八位字節),每個字節中的最低有效位在前,而IEEE 802.5(令牌環)和IEEE 802.6發送字節在電線上,最高有效位在前

規范格式的地址12-34-56-78-9A-BC將以標准傳輸順序(最低有效位在先)作為位10000100 00101100 01101010 00011110 01011001 00111101通過網絡傳輸。

但是對於令牌環網絡,它將以最高有效位第一順序作為位00010010 00110100 01010110 01111000 10011010 10111100進行傳輸。 后者可能會錯誤地顯示為48-2C-6A-1E-59-3D。 這稱為位反轉順序,非規范形式,MSB格式,IBM格式或令牌環格式。 通常首選規范形式,並且所有現代實現都使用規范形式。

像mac地址一樣,在其他許多情況下(例如openflow / sdn)也使用64位數字。 希望它只是64位數字,請嘗試以下操作,

union {
   char charId[8];
   uint64_t numId;
} dpId;
char *save_ptr=0;
uint8_t i = 0;
char* dpid_str = "C0:0C:C1:1C:C2:2C:01:00";
char* token = strtok_r(dpid_str, ":", &save_ptr);
while(token != NULL && i < 8){
    dpId.charId[i++] = std::stoi(token,0,16);
    token = strtok_r(NULL,":",&save_ptr);
}
dpId.numId = ntohll(dpId.numId);

暫無
暫無

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

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