Проблемы с печатью MAC-адреса

MAC-адрес разбивается на массив байтов (macaddr). Байты печатаются с printf() один за другим. Байты должны выглядеть как пары шестнадцатеричных символов. Но некоторые из них дополнены f символами.

Например, для macaddr[3] печатается 'ffffffcc', а не 'cc', то есть 4 байта вместо одного байта. Остальные элементы массива печатаются правильно (macaddr[0] = 00, macaddr[1] = AA, macaddr[2] = BB и т. д.)

В чем проблема? Помогите, пожалуйста, разобраться, что не так с программой.

#include <stdio.h>
#include <net/if.h> // struct ifconf
#include <errno.h>
#include <libnet.h>
#include <pcap.h>
#include <stdlib.h>
#include <unistd.h>

int getmacaddr() ;

int main(int argc, char *argv[])
{
    getmacaddr();    
}

int getmacaddr()
{
    struct ifconf ifc;
    struct ifreq *ifr;
    int sfd;
    int i;
    int devnums;
    char macaddr[ETHER_ADDR_LEN];

    ifc.ifc_req = NULL;

    sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd == -1)
    {
        perror("socket : ");
        return -1;
    }

    // get ifc.ifc_len
    if(ioctl(sfd,SIOCGIFCONF,&ifc) == -1)
    {
        perror("ioctl - SIOCGIFCONF : ");
        return -1;
    }
    devnums = ifc.ifc_len / sizeof(struct ifreq);

    // malloc ifc.ifc_buf and get IFCONF list
    ifc.ifc_buf = malloc(ifc.ifc_len);
    memset(ifc.ifc_buf,0x0,ifc.ifc_len);

    if(ioctl(sfd,SIOCGIFCONF,&ifc) == -1)
    {
        perror("ioctl - SIOCGIFCONF : ");
        return -1;
    }


    for(i = 0; i < devnums; i++,ifc.ifc_req++)
    {
        // idfy dev
        if( strcmp(ifc.ifc_req->ifr_ifrn.ifrn_name,"lo") && ifc.ifc_req->ifr_ifrn.ifrn_name != 0)
        {
            ifr = ifc.ifc_req;

            // IP address
            struct sockaddr_in *a = (struct sockaddr_in *) &ifr->ifr_addr;
            printf("%s",inet_ntoa(a->sin_addr));
            printf("\n");

            //get IFHWADDR
            if(ioctl(sfd,SIOCGIFHWADDR,ifr) == -1)
            {
                perror("ioctl - SIOCGIFHWADDR : ");
                return -1;
            }            
        }
    }

    memcpy(macaddr,ifr->ifr_hwaddr.sa_data,sizeof(macaddr));
    for(i = 0; i < ETHER_ADDR_LEN; i++)
    {
        printf("%02x ",macaddr[i]);
    }
    printf("\n");

    close(sfd);
    //    free(ifc.ifc_buf);   <- ?? error

    return 0;
}

ИЗМЕНИТЬ

Я заменил следующую строку:

printf("%02x ",macaddr[i]);

с участием

printf("%02x ", (macaddr[i] & 0xff));

person hwisang    schedule 01.10.2016    source источник


Ответы (1)


Попробуй это:

printf("%02x ", (unsigned char)macaddr[i] & 0xff);

Мы указываем минимальную ширину поля в строке формата. Таким образом, чтобы убедиться, что значение будет выглядеть точно как один байт, вы можете оставить только первые 16 бит, применив битовую маску.

person Ruslan Osmanov    schedule 01.10.2016
comment
Я решил проблему, но мне все еще любопытно, почему macaddr[3] печатает 'ffffffcc'. в любом случае большое спасибо! - person hwisang; 01.10.2016
comment
@black, хм, должна быть другая проблема. Не могли бы вы обновить свой пост с новым кодом? - person Ruslan Osmanov; 01.10.2016
comment
Я просто заменил [printf(%02x ,macaddr[i]);] на [printf(%02x , (macaddr[i] & 0xff));]. остаток такой же. - person hwisang; 01.10.2016
comment
@черный, это действительно странно. Надеюсь, вы не возражаете, что я отредактировал ваш пост. Исходный текст доступен в более старых версиях, если вы обнаружите, что изменения неверны. - person Ruslan Osmanov; 01.10.2016
comment
В предыдущей версии я мог воспроизвести проблему (она печатала 08 ffffffed ffffffb9 25 ffffffe9 56 на моем локальном компьютере). После применения маски печатается 08 ed b9 25 e9 56. - person Ruslan Osmanov; 01.10.2016
comment
Я ценю ваше редактирование. мой пост получить лучшее предложение. вы так добры. очень большое спасибо!! - person hwisang; 01.10.2016
comment
о, я нахожу, чтобы решить это! Это подписанная и неподписанная проблема link Это все благодаря вам. потому что мой английский очень плохой, поэтому я не знаю, какое слово я ищу. Но после того, как вы переписали, я могу найти слово для решения этой проблемы. Благодарность! - person hwisang; 01.10.2016
comment
@black, хех, подпись. Верно. - person Ruslan Osmanov; 01.10.2016