2013-05-14 19 views
9

Bir MAC adresini int dizisinde C dizesinde nasıl dizilir?Bir MAC adresini (bir dizide) C dizgesine nasıl dönüştürürsünüz?

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

nasıl "00:0d:3f:cd:02:5f" gibi bir dizeye bu dönüştürebilirim: Örneğin, ben bir MAC adresini depolamak için aşağıdaki diziyi kullanıyorum?

+5

[(s) (sn) printf()] (http://linux.die.net/man/3/printf) arkadaşın. –

+0

Bir MAC adresinin her baytı için bir 'int'? O.o – mpontillo

+0

Biliyorum, biraz büyük! – user2131316

cevap

10

Bunu yapabilirsiniz:

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 - ancak '% 02x', talep edildiği gibi harf durumunu yapar. – Roddy

+0

haklısın, teşekkürler, farkettim ve değiştireceğim. – Gisway

+1

-1, çünkü dizideki "int" çok büyükse, bu 'str'yi taşar. – mpontillo

-1

çağrı sprintf'i() bir döngüde^_ ^:

#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

İlk olarak, muhtemelen kullandığınız türü ayarlamak istediğiniz MAC adresini saklamak için Bu durumda unsigned char'un daha iyi olduğunu düşünüyorum. Ardından, MAC adreslerini yazmak için bir işlev oluşturmanızı öneririm, böylece kodunuzdaki her yerde aynı printf() ifadesini kopyalayıp yapıştırma ve dizine eklediğiniz diziyi ayarlama. İşte

(ayrıca, bu. Derleyici doğru olduğundan emin olmak için İşlev parametresi karşı kullandığınız türünü kontrol sağlar) inet_ntoa() benzer evresel olmayan çözüm ve inet_ntoa_r() benzer bir evresel çözüm hem var :

#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, reentran olmayan bir noktaya işaret etmek için +1 ;-) – Roddy

+0

@Roddy, tamam, güzel, sadece sizin için bir reentrant sürümü ekledim. ;-) – mpontillo

İlgili konular