2011-01-19 66 views
1

例如我有一个MAC地址值为“0:22:3f:a:5d:16”,我该如何将它转换为人类可读的格式,如“00: 22:3F:0A:5D:16" ? 我的MAC地址丢失的前导零,因为我使用MAC地址:pad缺少左边的零

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

ether_nota删除前导零,我不知道是否有其他方法来存储一个适当的MAC地址为一个字符串。

+0

我想你可以通过选入ether_addr成员来单独打印MAC地址的每个字节。 – 2011-01-19 15:06:08

回答

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