Преобразование строки с адресом ma c в шестнадцатеричный код в C - PullRequest
0 голосов
/ 14 апреля 2020

Я хочу преобразовать строку с адресом ma c в шестнадцатеричный формат.

  • Ввод:
char remote_device_mac[] = "00a05056a810";
  • Ожидаемый результат:
uint8_t base_mac_addr[6] = {0x00,0xa0,0x50,0x56,0xa8,0x10};

Мой код: -

char dummy[2] = {0};
int j = 0;
uint8_t num = 0;
     for(int k=0;k<6;k++)
     {
        for(int i=0;i<2;i++)
            dummy[i] = remote_device_mac[i+j];

        num = (int)strtol(dummy, NULL, 8);
        j=j+2;
        sprintf(base_mac_addr[k], "%x", num);

        num = 0; 
        memset(dummy,0,2);
     }

Ответы [ 2 ]

1 голос
/ 14 апреля 2020
char dummy[2] = {0};

размер dummy имеет не менее 3 байтов (2 для значения в гекса, 1 для \0). Таким образом, вы можете объявить как:

char dummy[3] = "00";

Используйте base = 16 вместо 10, потому что вы хотите преобразовать в шестнадцатеричное.

num = strtol(dummy, &ptr, 16);

sprintf не требуется (используйте его, если Вы хотите скопировать число в строку).

// assign each base_mac_addr to num.
base_mac_addr[k] = num;

Наконец, код, как показано ниже:

     for(int k=0;k<6;k++)
     {
        for(int i=0;i<2;i++)
            dummy[i] = remote_device_mac[i+j];
        num = strtol(dummy, &ptr, 16);
        j=j+2;
        printf("0x%2x\n", num);
        base_mac_addr[k] = num;
     }
0 голосов
/ 14 апреля 2020

Как отмечалось в комментариях, используйте strtol основание 16 и перебирайте массив в блоках по 2 цифры: demo

    char array[] = "00a05056a810";
    size_t size = strlen(array);

    for(int i=0;i<(int)size;i=i+2) {
        char dig[] = {array[i],array[i+1],'\0'};
        long val = strtol(dig,NULL,16);
        printf("%lx\n",val);
    } 
...