2013-05-14 36 views
9

intアレイ内のMACアドレスをCの文字列に変換するにはどうすればよいですか?例えば、私はMACアドレスを保存するために、以下の配列を使用しています:どのようにMACアドレス(配列内)をCの文字列に変換しますか?

int array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f}; 

どのように私は"00:0d:3f:cd:02:5f"のように、文字列にこれを変換するのですか?

+5

[(s)(sn)printf()](http://linux.die.net/man/3/printf)はあなたの友人です。 –

+0

MACアドレスの各バイトの 'int'は? O.o – mpontillo

+0

私は知っている、それは少し大きいです! – user2131316

答えて

10

あなたがこれを行うことができます:ループ内

char macStr[18]; 
int array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f}; 

snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x", 
     array[0], array[1], array[2], array[3], array[4], array[5]); 
2
unsigned char array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f};//or BYTE 

char str[19]; 
sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x:%02x",array[0], 
     array[1], array[2], array[3], array[4],array[5]); 
+0

+1 - しかし '%02x'は大文字小文字を要求通りにします。 – Roddy

+0

あなたは正しいです、感謝した私はそれを気づいた、そして私はそれを変更するつもりです。 – Gisway

+1

-1は配列の 'int'が大きすぎると' str'をオーバーフローさせるので-1です。 – mpontillo

-1

コールのsprintf()^_ ^:

#include <stdio.h> 

int array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f}; 

void macaddress_str(int a[], char *buf) 
{ 
    int i; 
    for (i = 0; i < 5; i++, buf += 3) 
     sprintf(buf, "%02X:", a[i]); 
    sprintf(buf, "%02X", a[i]); 
} 

int main() 
{ 
    char buf[100]; 
    macaddress_str(array, buf); 
    printf("%s\n", buf); 
    return 0; 
} 
0

まず、あなたはおそらく、あなたが使うタイプを調整したいですMACアドレスを保存します。この場合はunsigned charが良いと思います。次に、MACアドレスを書き込む関数を作成することをお勧めします。つまり、コード内のどこでも同じprintf()ステートメントをコピー&ペーストしたり、インデックスを作成している配列を調整したりすることはありません。 (コンパイラは、使用している型を関数パラメータと照合して正しいかどうかを確認することもできます)

inet_ntoa()に似た再入可能でないソリューションと、inet_ntoa_r()と同様の再入可能なソリューションです:

#include <stdio.h> 

unsigned char mac[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f}; 

char* MACADDR_toString(unsigned char* addr) 
{ 
    static char str[18]; 

    if(addr == NULL) return ""; 

    snprintf(str, sizeof(str), "%02x:%02x:%02x:%02x:%02x:%02x", 
      addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); 

    return str; 
} 

char* MACADDR_toString_r(unsigned char* addr, char* str, size_t size) 
{ 
    if(addr == NULL || str == NULL || size < 18) return NULL; 

    snprintf(str, size, "%02x:%02x:%02x:%02x:%02x:%02x", 
      addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); 

    return str; 
} 

int main(int argc, char* argv[]) 
{ 
    char str[18]; 
    printf("%s\n", MACADDR_toString(mac)); 
    printf("%s\n", MACADDR_toString_r(mac, str, sizeof(str))); 
    return 0; 
} 
+0

-1リエントラントでない解決策では+1、リエントラントではないことを示す+1 ;-) – Roddy

+0

@Roddy、OK、うん、ちょうどあなたのためにリエントラント版を追加しました。 ;-) – mpontillo

関連する問題