MAC地址:填充缺少左边的零

时间:2011-01-19 14:57:39

标签: c++

例如,我的MAC地址的值为“0:22:3f:a:5d:16”,我如何将其转换为人类可读的格式,如“00:22:3f:0a:5d :16" ? 我的mac地址缺少前导零,因为我使用

string asd = ether_ntoa ((struct ether_addr *)p->add2);//p->add2 is a unsigned char[6]

ether_nota删除前导零,我不知道是否有其他方法可以将正确的MAC地址存储为字符串。

1 个答案:

答案 0 :(得分:7)

导致它打印而没有填充零的implementation只是printf,他们使用%x代替%02xstruct ether_addr格式为documented in the man page,因此其内部结构不是私密的。

The structure ether_addr is defined in <net/ethernet.h> as:

struct ether_addr {
    uint8_t ether_addr_octet[6];
}

所以说,我会实现自己的版本。 rz表示可以在此处重新填充和零填充。

char *ether_ntoa_rz(const struct ether_addr *addr, char *buf)
{
    sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x",
            addr->ether_addr_octet[0], addr->ether_addr_octet[1],
            addr->ether_addr_octet[2], addr->ether_addr_octet[3],
            addr->ether_addr_octet[4], addr->ether_addr_octet[5]);
    return buf;
}

非重入版本只有一个静态缓冲区并调用可重入的版本。

char *ether_ntoa_z(const struct ether_addr *addr)
{
    static char buf[18];    /* 12 digits + 5 colons + null terminator */
    return ether_ntoa_rz(addr, buf);
}

如果你想看一下glibc中函数的实现,你可以find it if you search