0

我正在编写一个代码,该代码需要我解析我以 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地址如何在网络上传输?

上面的代码片段是否适用于所有平台?

4

4 回答 4

5

网络字节顺序是 big-endian,所以如果你有 big-endian 格式的地址,它将以这种方式传输和接收——不需要字节交换。

于 2013-07-01T07:02:48.007 回答
4

帧中的字节具有固定顺序(@Caleb 指出的大端序),与主机的字节序无关。

由于您是一个接一个地复制字节,这将始终有效。只有当您使用多字节分配或memcpy's 从帧数据到short, int, ... 时才会出现问题。看看将网络转换为主机的ntohs()朋友们,反之亦然。

于 2013-07-01T07:04:28.717 回答
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 格式或令牌环格式。规范形式通常是首选,并被所有现代实现使用。

于 2013-07-01T07:06:40.820 回答
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);
于 2014-04-11T17:15:58.137 回答