2013-05-14 7 views
9

Wie konvertiert man eine MAC-Adresse innerhalb eines int Arrays in einen String in C? Zum Beispiel verwende ich die folgende Array mit einer MAC-Adresse zu speichern:Wie konvertiert man eine MAC-Adresse (in einem Array) in eine Zeichenfolge in C?

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

Wie konvertiere ich dies in einen String, wie "00:0d:3f:cd:02:5f"?

+5

[(s) (sn) printf()] (http://linux.die.net/man/3/printf) ist dein Freund. –

+0

Ein 'int' für jedes Byte einer MAC-Adresse? O.o – mpontillo

+0

Ich weiß, es ist ein bisschen groß! – user2131316

Antwort

10

Sie können dies tun:

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 - aber '% 02x' würde den Brieffall wie gewünscht machen. – Roddy

+0

Sie haben Recht, danke, dass ich das bemerkt habe, und ich werde es ändern. – Gisway

+1

-1, weil dies "str" ​​überläuft, wenn die 'int's im Array zu groß sind. – mpontillo

-1

Anruf sprintf() in einer Schleife^_ ^:

#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

Zuerst möchten Sie wahrscheinlich die Art anpassen Sie verwenden um die MAC-Adresse zu speichern. Ich denke, unsigned char ist in diesem Fall besser. Als Nächstes empfehle ich Ihnen, eine Funktion zum Schreiben der MAC-Adressen zu erstellen, sodass Sie nicht die gleiche printf() Anweisung überall in Ihrem Code kopieren und das Array, das Sie indexieren, anpassen. (Auch erlaubt es der Compiler den Typ zu überprüfen Sie verwenden gegen den Funktionsparameter, um sicherzustellen, es ist richtig.)

Hier ist sowohl eine nicht-Reentry-Lösung ähnlich wie inet_ntoa() und eine Reentry-Lösung ähnlich wie 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 für eine nicht-reentrante Lösung, +1 für die Erkennung, dass es nicht reentrant ist ;-) – Roddy

+0

@Roddy, OK, gut, ich habe eine Reentrant-Version nur für dich hinzugefügt. ;-) – mpontillo

Verwandte Themen