我正在编写一个代码,要求我解析一个以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地址?
以上代码段是否适用于所有平台?
答案 0 :(得分:4)
Network byte order is big-endian,所以如果你有大端格式的地址,它将以这种方式传输和接收 - 不需要字节交换。
答案 1 :(得分:4)
帧中的字节是固定的顺序(@Caleb指出的大端),与主机的字节顺序无关。
由于您将逐个复制字节,因此这将始终有效。当您将帧数据中的多字节分配或memcpy
用于short
,int
时,只会出现问题....看看ntohs()
and friends将网络转换为主机,反之亦然。
答案 2 :(得分:2)
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格式或令牌环格式。规范形式通常是首选,并被所有现代实现使用。
答案 3 :(得分: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);