2013-07-01 38 views
0

我正在處理一個代碼,需要我解析我以uint8_t *指針形式接收的傳入幀。MAC地址上的網絡字節順序

我已經編寫了一個實用程序方法來從幀中獲取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:1207:C0:3D:25」在大端格式,將它以相同的順序傳輸?

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

上述代碼片段是否適用於所有平臺?

+0

參考您的第一個問題:**僅發送軟件知道什麼**它把上線了,無論是越野車和發送不同的字節順序取決於它運行的硬件。 – alk

回答

4

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

由於您一個接一個地複製字節,這將始終有效。從幀數據到short,int,...使用多字節賦值或memcpy只有一個問題。請看看ntohs() and friends將網絡轉換爲主機,反之亦然。

1

用於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格式或令牌環格式。規範形式通常是首選,並被所有現代實現所使用。

0

與mac地址一樣,在許多其他情況下使用64位數字,例如openflow/sdn。它喜歡它是隻是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); 
相關問題