2011-01-19 10 views
1

例えば、私は "0:22:3f:a:5d:16"の値を持つMACアドレスを持っています。これを "00: 22:3f:0a:5d:16 "?文字列として適切なMACアドレスを格納するための他の方法があるかどう 私はMACアドレス:pad missing leftゼロ

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

ether_notaが先行ゼロを削除する使用しているため、私のMACアドレスは、先頭のゼロが欠落している、私は知りません。

+0

ether_addrメンバーを選んでMACアドレスの各バイトを個別に印刷することができますね。 –

+0

はい、私はそれらを印刷することができますが、私はどのように文字列に格納するのですか? – cftmon

答えて

7

ゼロ埋め込みなしで印刷されるimplementationは、の代わりに%xを使用すると、printfです。 struct 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は、ここではリエントラントで0を意味します。

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をすることができます。