10

int配列内のMACアドレスをCの文字列に変換するにはどうすればよいですか? たとえば、次の配列を使用して MAC アドレスを格納しています。

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

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

4

7 に答える 7

14

あなたはこれを行うことができます:

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]);

大文字の文字列が必要な場合は、大文字の 'X' を使用します。

snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X",
         array[0], array[1], array[2], array[3], array[4], array[5]);
于 2013-05-14T18:53:21.777 に答える
3
unsigned char array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f};//or BYTE

char str[19];
sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x",array[0], 
        array[1], array[2], array[3], array[4],array[5]);
于 2013-05-14T18:52:31.373 に答える
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;
}
于 2013-05-14T18:58:16.383 に答える